Compare commits
	
		
			143 Commits
		
	
	
		
			v2.7.0
			...
			version_up
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					73dbd2f36a | ||
| 
						 | 
					06ad21c5fb | ||
| 
						 | 
					cd177040fe | ||
| 
						 | 
					23cf3042b3 | ||
| 
						 | 
					1f02c9fec4 | ||
| 
						 | 
					7ba9b43b56 | ||
| 
						 | 
					0178b5e5d0 | ||
| 
						 | 
					c020e702df | ||
| 
						 | 
					7e72cc7ac7 | ||
| 
						 | 
					a283f31d7f | ||
| 
						 | 
					13d2d39aed | ||
| 
						 | 
					7d5c130d5c | ||
| 
						 | 
					bc4da0aaeb | ||
| 
						 | 
					bf3a689249 | ||
| 
						 | 
					dea5bb96e5 | ||
| 
						 | 
					381006b9f5 | ||
| 
						 | 
					92bc511ec5 | ||
| 
						 | 
					73686f8a6c | ||
| 
						 | 
					48b8705fc6 | ||
| 
						 | 
					0ba38c8736 | ||
| 
						 | 
					b018dc70ef | ||
| 
						 | 
					42d44b056e | ||
| 
						 | 
					7d9d5b4d15 | ||
| 
						 | 
					7fc77e529b | ||
| 
						 | 
					e8986d84b4 | ||
| 
						 | 
					f54fd2b411 | ||
| 
						 | 
					86f3754c7e | ||
| 
						 | 
					260927a3eb | ||
| 
						 | 
					bb571ad11a | ||
| 
						 | 
					bd0fbfd6d2 | ||
| 
						 | 
					33ba7b2323 | ||
| 
						 | 
					28cbc79890 | ||
| 
						 | 
					0137d8ee66 | ||
| 
						 | 
					1ca77de37e | ||
| 
						 | 
					bd5ae332bd | ||
| 
						 | 
					28dcf0085c | ||
| 
						 | 
					f1a687f6e1 | ||
| 
						 | 
					d2bae99b3c | ||
| 
						 | 
					180d8d1502 | ||
| 
						 | 
					bd7eca32f4 | ||
| 
						 | 
					43658550df | ||
| 
						 | 
					c113fc24c5 | ||
| 
						 | 
					5ddbd0bad3 | ||
| 
						 | 
					8d030ff51b | ||
| 
						 | 
					388e5d9aee | ||
| 
						 | 
					a1ea461b68 | ||
| 
						 | 
					a77ef768e3 | ||
| 
						 | 
					24e275743e | ||
| 
						 | 
					3366b933bf | ||
| 
						 | 
					6cd1c9a0f6 | ||
| 
						 | 
					cb8c526b9b | ||
| 
						 | 
					f95ed7624b | ||
| 
						 | 
					ddfa040d4e | ||
| 
						 | 
					fa379befe4 | ||
| 
						 | 
					9100a023b0 | ||
| 
						 | 
					071e6ab86e | ||
| 
						 | 
					383343a2e5 | ||
| 
						 | 
					efb2623613 | ||
| 
						 | 
					a7d8517291 | ||
| 
						 | 
					7bf98b96de | ||
| 
						 | 
					40d2458f38 | ||
| 
						 | 
					62f98adc83 | ||
| 
						 | 
					96da7500a6 | ||
| 
						 | 
					13556889e6 | ||
| 
						 | 
					43fc8f7f09 | ||
| 
						 | 
					bfdec30974 | ||
| 
						 | 
					ae2cbb9971 | ||
| 
						 | 
					6f0c8b550c | ||
| 
						 | 
					64e6a6f70a | ||
| 
						 | 
					c67367ec4d | ||
| 
						 | 
					fe3c5d7c4a | ||
| 
						 | 
					3c8d8697e0 | ||
| 
						 | 
					7b0c61ff5e | ||
| 
						 | 
					2255988b4c | ||
| 
						 | 
					106c9353fc | ||
| 
						 | 
					6c7fc8e310 | ||
| 
						 | 
					e151b45d51 | ||
| 
						 | 
					1584ff1ebe | ||
| 
						 | 
					82ccb08d6b | ||
| 
						 | 
					82b184a79f | ||
| 
						 | 
					71c37edde7 | ||
| 
						 | 
					0c8fa44935 | ||
| 
						 | 
					32714f95b6 | ||
| 
						 | 
					13cbf8c603 | ||
| 
						 | 
					48c95c3101 | ||
| 
						 | 
					857055750f | ||
| 
						 | 
					96b22ef09b | ||
| 
						 | 
					acff9afff2 | ||
| 
						 | 
					1e250be2cd | ||
| 
						 | 
					93a8624645 | ||
| 
						 | 
					b9bf57e1f2 | ||
| 
						 | 
					f203622299 | ||
| 
						 | 
					698282658c | ||
| 
						 | 
					5baacac9bf | ||
| 
						 | 
					8ca4531c99 | ||
| 
						 | 
					a6e0cd453b | ||
| 
						 | 
					5e39f63fd2 | ||
| 
						 | 
					9b081c6924 | ||
| 
						 | 
					be2150d845 | ||
| 
						 | 
					2d6f1879f5 | ||
| 
						 | 
					e870a381a8 | ||
| 
						 | 
					0cc0d0204e | ||
| 
						 | 
					498e55f933 | ||
| 
						 | 
					a9b3cb9821 | ||
| 
						 | 
					29736da681 | ||
| 
						 | 
					28f890002b | ||
| 
						 | 
					0ec0a4fd95 | ||
| 
						 | 
					6dce398ddc | ||
| 
						 | 
					eca0e8883a | ||
| 
						 | 
					43cc667a59 | ||
| 
						 | 
					a084230cbd | ||
| 
						 | 
					59c5ed51c0 | ||
| 
						 | 
					1128fd3c23 | ||
| 
						 | 
					ee4f1fac93 | ||
| 
						 | 
					a1a600de77 | ||
| 
						 | 
					9d64c2dabd | ||
| 
						 | 
					4f6c9728ef | ||
| 
						 | 
					167933e422 | ||
| 
						 | 
					f661bb579a | ||
| 
						 | 
					1e14eb1611 | ||
| 
						 | 
					dae57a7492 | ||
| 
						 | 
					d30014372b | ||
| 
						 | 
					a9f37ae30d | ||
| 
						 | 
					23bc11f26e | ||
| 
						 | 
					caa25f0a1e | ||
| 
						 | 
					b86e80be6d | ||
| 
						 | 
					880a14b651 | ||
| 
						 | 
					fa5d1b982a | ||
| 
						 | 
					e803885d24 | ||
| 
						 | 
					17b7e1de59 | ||
| 
						 | 
					15d7ae635c | ||
| 
						 | 
					244423132e | ||
| 
						 | 
					ad149a8e40 | ||
| 
						 | 
					59020f8809 | ||
| 
						 | 
					4c5dbea4fb | ||
| 
						 | 
					8fa42ab75d | ||
| 
						 | 
					ad1d7301a1 | ||
| 
						 | 
					6ad2f0ba1b | ||
| 
						 | 
					aad7cf752a | ||
| 
						 | 
					ff8fa5e625 | ||
| 
						 | 
					6e38083912 | ||
| 
						 | 
					98509fdab7 | ||
| 
						 | 
					2bbaf44e88 | 
							
								
								
									
										178
									
								
								.clang-format
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,178 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					Language:        Cpp
 | 
				
			||||||
 | 
					# BasedOnStyle:  LLVM
 | 
				
			||||||
 | 
					AccessModifierOffset: -2
 | 
				
			||||||
 | 
					AlignAfterOpenBracket: Align
 | 
				
			||||||
 | 
					AlignArrayOfStructures: None
 | 
				
			||||||
 | 
					AlignConsecutiveMacros: None
 | 
				
			||||||
 | 
					AlignConsecutiveAssignments: None
 | 
				
			||||||
 | 
					AlignConsecutiveBitFields: None
 | 
				
			||||||
 | 
					AlignConsecutiveDeclarations: None
 | 
				
			||||||
 | 
					AlignEscapedNewlines: Right
 | 
				
			||||||
 | 
					AlignOperands:   Align
 | 
				
			||||||
 | 
					AlignTrailingComments: true
 | 
				
			||||||
 | 
					AllowAllArgumentsOnNextLine: true
 | 
				
			||||||
 | 
					AllowAllConstructorInitializersOnNextLine: true
 | 
				
			||||||
 | 
					AllowAllParametersOfDeclarationOnNextLine: true
 | 
				
			||||||
 | 
					AllowShortEnumsOnASingleLine: true
 | 
				
			||||||
 | 
					AllowShortBlocksOnASingleLine: Never
 | 
				
			||||||
 | 
					AllowShortCaseLabelsOnASingleLine: false
 | 
				
			||||||
 | 
					AllowShortFunctionsOnASingleLine: All
 | 
				
			||||||
 | 
					AllowShortLambdasOnASingleLine: All
 | 
				
			||||||
 | 
					AllowShortIfStatementsOnASingleLine: Never
 | 
				
			||||||
 | 
					AllowShortLoopsOnASingleLine: false
 | 
				
			||||||
 | 
					AlwaysBreakAfterDefinitionReturnType: None
 | 
				
			||||||
 | 
					AlwaysBreakAfterReturnType: None
 | 
				
			||||||
 | 
					AlwaysBreakBeforeMultilineStrings: false
 | 
				
			||||||
 | 
					AlwaysBreakTemplateDeclarations: MultiLine
 | 
				
			||||||
 | 
					AttributeMacros:
 | 
				
			||||||
 | 
					  - __capability
 | 
				
			||||||
 | 
					BinPackArguments: true
 | 
				
			||||||
 | 
					BinPackParameters: true
 | 
				
			||||||
 | 
					BraceWrapping:
 | 
				
			||||||
 | 
					  AfterCaseLabel:  false
 | 
				
			||||||
 | 
					  AfterClass:      false
 | 
				
			||||||
 | 
					  AfterControlStatement: Never
 | 
				
			||||||
 | 
					  AfterEnum:       false
 | 
				
			||||||
 | 
					  AfterFunction:   false
 | 
				
			||||||
 | 
					  AfterNamespace:  false
 | 
				
			||||||
 | 
					  AfterObjCDeclaration: false
 | 
				
			||||||
 | 
					  AfterStruct:     false
 | 
				
			||||||
 | 
					  AfterUnion:      false
 | 
				
			||||||
 | 
					  AfterExternBlock: false
 | 
				
			||||||
 | 
					  BeforeCatch:     false
 | 
				
			||||||
 | 
					  BeforeElse:      false
 | 
				
			||||||
 | 
					  BeforeLambdaBody: false
 | 
				
			||||||
 | 
					  BeforeWhile:     false
 | 
				
			||||||
 | 
					  IndentBraces:    false
 | 
				
			||||||
 | 
					  SplitEmptyFunction: true
 | 
				
			||||||
 | 
					  SplitEmptyRecord: true
 | 
				
			||||||
 | 
					  SplitEmptyNamespace: true
 | 
				
			||||||
 | 
					BreakBeforeBinaryOperators: None
 | 
				
			||||||
 | 
					BreakBeforeConceptDeclarations: true
 | 
				
			||||||
 | 
					BreakBeforeBraces: Attach
 | 
				
			||||||
 | 
					BreakBeforeInheritanceComma: false
 | 
				
			||||||
 | 
					BreakInheritanceList: BeforeColon
 | 
				
			||||||
 | 
					BreakBeforeTernaryOperators: true
 | 
				
			||||||
 | 
					BreakConstructorInitializersBeforeComma: false
 | 
				
			||||||
 | 
					BreakConstructorInitializers: BeforeColon
 | 
				
			||||||
 | 
					BreakAfterJavaFieldAnnotations: false
 | 
				
			||||||
 | 
					BreakStringLiterals: true
 | 
				
			||||||
 | 
					ColumnLimit:     100
 | 
				
			||||||
 | 
					CommentPragmas:  '^ IWYU pragma:'
 | 
				
			||||||
 | 
					CompactNamespaces: false
 | 
				
			||||||
 | 
					ConstructorInitializerAllOnOneLineOrOnePerLine: false
 | 
				
			||||||
 | 
					ConstructorInitializerIndentWidth: 4
 | 
				
			||||||
 | 
					ContinuationIndentWidth: 4
 | 
				
			||||||
 | 
					Cpp11BracedListStyle: true
 | 
				
			||||||
 | 
					DeriveLineEnding: true
 | 
				
			||||||
 | 
					DerivePointerAlignment: false
 | 
				
			||||||
 | 
					DisableFormat:   false
 | 
				
			||||||
 | 
					EmptyLineAfterAccessModifier: Never
 | 
				
			||||||
 | 
					EmptyLineBeforeAccessModifier: LogicalBlock
 | 
				
			||||||
 | 
					ExperimentalAutoDetectBinPacking: false
 | 
				
			||||||
 | 
					FixNamespaceComments: true
 | 
				
			||||||
 | 
					ForEachMacros:
 | 
				
			||||||
 | 
					  - foreach
 | 
				
			||||||
 | 
					  - Q_FOREACH
 | 
				
			||||||
 | 
					  - BOOST_FOREACH
 | 
				
			||||||
 | 
					IfMacros:
 | 
				
			||||||
 | 
					  - KJ_IF_MAYBE
 | 
				
			||||||
 | 
					IncludeBlocks:   Preserve
 | 
				
			||||||
 | 
					IncludeCategories:
 | 
				
			||||||
 | 
					  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
 | 
				
			||||||
 | 
					    Priority:        2
 | 
				
			||||||
 | 
					    SortPriority:    0
 | 
				
			||||||
 | 
					    CaseSensitive:   false
 | 
				
			||||||
 | 
					  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
 | 
				
			||||||
 | 
					    Priority:        3
 | 
				
			||||||
 | 
					    SortPriority:    0
 | 
				
			||||||
 | 
					    CaseSensitive:   false
 | 
				
			||||||
 | 
					  - Regex:           '.*'
 | 
				
			||||||
 | 
					    Priority:        1
 | 
				
			||||||
 | 
					    SortPriority:    0
 | 
				
			||||||
 | 
					    CaseSensitive:   false
 | 
				
			||||||
 | 
					IncludeIsMainRegex: '(Test)?$'
 | 
				
			||||||
 | 
					IncludeIsMainSourceRegex: ''
 | 
				
			||||||
 | 
					IndentAccessModifiers: false
 | 
				
			||||||
 | 
					IndentCaseLabels: false
 | 
				
			||||||
 | 
					IndentCaseBlocks: false
 | 
				
			||||||
 | 
					IndentGotoLabels: true
 | 
				
			||||||
 | 
					IndentPPDirectives: None
 | 
				
			||||||
 | 
					IndentExternBlock: AfterExternBlock
 | 
				
			||||||
 | 
					IndentRequires:  false
 | 
				
			||||||
 | 
					IndentWidth:     4
 | 
				
			||||||
 | 
					IndentWrappedFunctionNames: false
 | 
				
			||||||
 | 
					InsertTrailingCommas: None
 | 
				
			||||||
 | 
					JavaScriptQuotes: Leave
 | 
				
			||||||
 | 
					JavaScriptWrapImports: true
 | 
				
			||||||
 | 
					KeepEmptyLinesAtTheStartOfBlocks: true
 | 
				
			||||||
 | 
					LambdaBodyIndentation: Signature
 | 
				
			||||||
 | 
					MacroBlockBegin: ''
 | 
				
			||||||
 | 
					MacroBlockEnd:   ''
 | 
				
			||||||
 | 
					MaxEmptyLinesToKeep: 1
 | 
				
			||||||
 | 
					NamespaceIndentation: All
 | 
				
			||||||
 | 
					ObjCBinPackProtocolList: Auto
 | 
				
			||||||
 | 
					ObjCBlockIndentWidth: 2
 | 
				
			||||||
 | 
					ObjCBreakBeforeNestedBlockParam: true
 | 
				
			||||||
 | 
					ObjCSpaceAfterProperty: false
 | 
				
			||||||
 | 
					ObjCSpaceBeforeProtocolList: true
 | 
				
			||||||
 | 
					PenaltyBreakAssignment: 2
 | 
				
			||||||
 | 
					PenaltyBreakBeforeFirstCallParameter: 19
 | 
				
			||||||
 | 
					PenaltyBreakComment: 300
 | 
				
			||||||
 | 
					PenaltyBreakFirstLessLess: 120
 | 
				
			||||||
 | 
					PenaltyBreakString: 1000
 | 
				
			||||||
 | 
					PenaltyBreakTemplateDeclaration: 10
 | 
				
			||||||
 | 
					PenaltyExcessCharacter: 1000000
 | 
				
			||||||
 | 
					PenaltyReturnTypeOnItsOwnLine: 60
 | 
				
			||||||
 | 
					PenaltyIndentedWhitespace: 0
 | 
				
			||||||
 | 
					PointerAlignment: Right
 | 
				
			||||||
 | 
					PPIndentWidth:   -1
 | 
				
			||||||
 | 
					ReferenceAlignment: Pointer
 | 
				
			||||||
 | 
					ReflowComments:  true
 | 
				
			||||||
 | 
					ShortNamespaceLines: 1
 | 
				
			||||||
 | 
					SortIncludes:    CaseSensitive
 | 
				
			||||||
 | 
					SortJavaStaticImport: Before
 | 
				
			||||||
 | 
					SortUsingDeclarations: true
 | 
				
			||||||
 | 
					SpaceAfterCStyleCast: false
 | 
				
			||||||
 | 
					SpaceAfterLogicalNot: false
 | 
				
			||||||
 | 
					SpaceAfterTemplateKeyword: true
 | 
				
			||||||
 | 
					SpaceBeforeAssignmentOperators: true
 | 
				
			||||||
 | 
					SpaceBeforeCaseColon: false
 | 
				
			||||||
 | 
					SpaceBeforeCpp11BracedList: false
 | 
				
			||||||
 | 
					SpaceBeforeCtorInitializerColon: true
 | 
				
			||||||
 | 
					SpaceBeforeInheritanceColon: true
 | 
				
			||||||
 | 
					SpaceBeforeParens: ControlStatements
 | 
				
			||||||
 | 
					SpaceAroundPointerQualifiers: Default
 | 
				
			||||||
 | 
					SpaceBeforeRangeBasedForLoopColon: true
 | 
				
			||||||
 | 
					SpaceInEmptyBlock: false
 | 
				
			||||||
 | 
					SpaceInEmptyParentheses: false
 | 
				
			||||||
 | 
					SpacesBeforeTrailingComments: 1
 | 
				
			||||||
 | 
					SpacesInAngles:  Never
 | 
				
			||||||
 | 
					SpacesInConditionalStatement: false
 | 
				
			||||||
 | 
					SpacesInContainerLiterals: true
 | 
				
			||||||
 | 
					SpacesInCStyleCastParentheses: false
 | 
				
			||||||
 | 
					SpacesInLineCommentPrefix:
 | 
				
			||||||
 | 
					  Minimum:         1
 | 
				
			||||||
 | 
					  Maximum:         -1
 | 
				
			||||||
 | 
					SpacesInParentheses: false
 | 
				
			||||||
 | 
					SpacesInSquareBrackets: false
 | 
				
			||||||
 | 
					SpaceBeforeSquareBrackets: false
 | 
				
			||||||
 | 
					BitFieldColonSpacing: Both
 | 
				
			||||||
 | 
					Standard:        Latest
 | 
				
			||||||
 | 
					StatementAttributeLikeMacros:
 | 
				
			||||||
 | 
					  - Q_EMIT
 | 
				
			||||||
 | 
					StatementMacros:
 | 
				
			||||||
 | 
					  - Q_UNUSED
 | 
				
			||||||
 | 
					  - QT_REQUIRE_VERSION
 | 
				
			||||||
 | 
					TabWidth:        4
 | 
				
			||||||
 | 
					UseCRLF:         false
 | 
				
			||||||
 | 
					UseTab:          Always
 | 
				
			||||||
 | 
					WhitespaceSensitiveMacros:
 | 
				
			||||||
 | 
					  - STRINGIZE
 | 
				
			||||||
 | 
					  - PP_STRINGIZE
 | 
				
			||||||
 | 
					  - BOOST_PP_STRINGIZE
 | 
				
			||||||
 | 
					  - NS_SWIFT_NAME
 | 
				
			||||||
 | 
					  - CF_SWIFT_NAME
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -27,7 +27,7 @@ jobs:
 | 
				
			|||||||
      DOCKER_REGISTRY_USERNAME: ucentral
 | 
					      DOCKER_REGISTRY_USERNAME: ucentral
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Checkout actions repo
 | 
					    - name: Checkout actions repo
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        repository: Telecominfraproject/.github
 | 
					        repository: Telecominfraproject/.github
 | 
				
			||||||
        path: github
 | 
					        path: github
 | 
				
			||||||
@@ -58,11 +58,11 @@ jobs:
 | 
				
			|||||||
    - name: Get base branch name and set as output
 | 
					    - name: Get base branch name and set as output
 | 
				
			||||||
      id: get_base_branch
 | 
					      id: get_base_branch
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        echo ::set-output name=branch::$(echo ${GITHUB_BASE_REF##*/})
 | 
					        echo "branch=$(echo ${GITHUB_BASE_REF##*/})" >> $GITHUB_OUTPUT
 | 
				
			||||||
        echo ::set-output name=owgw_branch::$(echo ${GITHUB_BASE_REF##*/} | sed 's/main/master/g')
 | 
					        echo "owgw_branch=$(echo ${GITHUB_BASE_REF##*/} | sed 's/main/master/g')" >> $GITHUB_OUTPUT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Checkout actions repo
 | 
					    - name: Checkout actions repo
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        repository: Telecominfraproject/.github
 | 
					        repository: Telecominfraproject/.github
 | 
				
			||||||
        path: github
 | 
					        path: github
 | 
				
			||||||
@@ -87,7 +87,7 @@ jobs:
 | 
				
			|||||||
      - docker
 | 
					      - docker
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Checkout actions repo
 | 
					    - name: Checkout actions repo
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        repository: Telecominfraproject/.github
 | 
					        repository: Telecominfraproject/.github
 | 
				
			||||||
        path: github
 | 
					        path: github
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								.github/workflows/openapi-pages.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					name: Update OpenAPI docs on GitHub Pages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - 'openapi/**'
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - main
 | 
				
			||||||
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defaults:
 | 
				
			||||||
 | 
					  run:
 | 
				
			||||||
 | 
					    shell: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  docsgen:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Generate static HTML page with docs from OpenAPI definition
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          docker run --rm -v "${PWD}:/local" openapitools/openapi-generator-cli:v6.2.1 generate -i https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralfms/main/openapi/owfms.yaml -g html2 --skip-validate-spec -o /local/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Update OpenAPI docs
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          mkdir tmp-docs
 | 
				
			||||||
 | 
					          mv index.html tmp-docs/index.html
 | 
				
			||||||
 | 
					          mkdir -p ~/.ssh
 | 
				
			||||||
 | 
					          ssh-keyscan -H github.com >> ~/.ssh/known_hosts
 | 
				
			||||||
 | 
					          echo https://tip-automation:${{ secrets.GIT_PUSH_PAT }}@github.com > ~/.git-credentials
 | 
				
			||||||
 | 
					          git config --global credential.helper store
 | 
				
			||||||
 | 
					          git config --global user.email "tip-automation@telecominfraproject.com"
 | 
				
			||||||
 | 
					          git config --global user.name "TIP Automation User"
 | 
				
			||||||
 | 
					          git pull
 | 
				
			||||||
 | 
					          git checkout gh-pages || git checkout -b gh-pages
 | 
				
			||||||
 | 
					          rm -rf docs
 | 
				
			||||||
 | 
					          mv tmp-docs docs
 | 
				
			||||||
 | 
					          git add docs
 | 
				
			||||||
 | 
					          git commit -m'Update OpenAPI docs for GitHub pages'
 | 
				
			||||||
 | 
					          git push --set-upstream origin gh-pages
 | 
				
			||||||
							
								
								
									
										121
									
								
								BUILDING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					# Building from source
 | 
				
			||||||
 | 
					In order to build OWFMS, you will need to install its dependencies, which includes the following:
 | 
				
			||||||
 | 
					- cmake
 | 
				
			||||||
 | 
					- boost
 | 
				
			||||||
 | 
					- POCO 1.10.1 or later
 | 
				
			||||||
 | 
					- a C++17 compiler
 | 
				
			||||||
 | 
					- openssl
 | 
				
			||||||
 | 
					- libpq-dev (PortgreSQL development libraries)
 | 
				
			||||||
 | 
					- mysql-client (MySQL client)
 | 
				
			||||||
 | 
					- librdkafka
 | 
				
			||||||
 | 
					- cppkafka
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Building is a 2 part process. The first part is to build a local copy of the framework tailored to your environment. This
 | 
				
			||||||
 | 
					framework is [Poco](https://github.com/pocoproject/poco). The version used in this project has a couple of fixes
 | 
				
			||||||
 | 
					from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/Telecominfraproject/wlan-cloud-lib-poco). Building
 | 
				
			||||||
 | 
					Poco may take several minutes depending on the platform you are building on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Ubuntu
 | 
				
			||||||
 | 
					These instructions have proven to work on Ubuntu 20.4.
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					sudo apt install git cmake g++ libssl-dev libmariabd-dev unixodbc-dev
 | 
				
			||||||
 | 
					sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
 | 
				
			||||||
 | 
					sudo apt install librdkafka-dev liblua5.3-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco
 | 
				
			||||||
 | 
					cd poco
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka
 | 
				
			||||||
 | 
					cd cppkafka
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
 | 
				
			||||||
 | 
					cd wlan-cloud-ucentralgw
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Fedora
 | 
				
			||||||
 | 
					The following instructions have proven to work on Fedora 33
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					sudo yum install cmake g++ openssl-devel unixODBC-devel mysql-devel mysql apr-util-devel boost boost-devel
 | 
				
			||||||
 | 
					sudo yum install yaml-cpp-devel lua-devel
 | 
				
			||||||
 | 
					sudo dnf install postgresql.x86_64 librdkafka-devel
 | 
				
			||||||
 | 
					sudo dnf install postgresql-devel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco
 | 
				
			||||||
 | 
					cd poco
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka
 | 
				
			||||||
 | 
					cd cppkafka
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralfms
 | 
				
			||||||
 | 
					cd wlan-cloud-ucentralfms
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Mac OSX Build
 | 
				
			||||||
 | 
					The following instructions have proven to work on OSX Big Sur. You need to install [Homebrew](https://brew.sh/). You must also have installed [XCode for OS X](https://www.freecodecamp.org/news/how-to-download-and-install-xcode/).
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					brew install \
 | 
				
			||||||
 | 
					    openssl cmake libpq mysql-client \
 | 
				
			||||||
 | 
					    apr apr-util boost yaml-cpp postgresql \
 | 
				
			||||||
 | 
					    unixodbc librdkafka
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco
 | 
				
			||||||
 | 
					cd poco
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release -j
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka
 | 
				
			||||||
 | 
					cd cppkafka
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					cmake --build . --config Release
 | 
				
			||||||
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralfms
 | 
				
			||||||
 | 
					cd wlan-cloud-ucentralfms
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					make -j
 | 
				
			||||||
 | 
					cd ../..
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.13)
 | 
					cmake_minimum_required(VERSION 3.13)
 | 
				
			||||||
project(owfms VERSION 2.7.0)
 | 
					project(owfms VERSION 3.2.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(CMAKE_CXX_STANDARD 17)
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,12 +27,12 @@ endif()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
find_package(Git QUIET)
 | 
					find_package(Git QUIET)
 | 
				
			||||||
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
 | 
					if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
 | 
				
			||||||
    execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
 | 
					    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
 | 
				
			||||||
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
					            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
				
			||||||
            RESULT_VARIABLE GIT_RESULT
 | 
					            RESULT_VARIABLE GIT_RESULT
 | 
				
			||||||
            OUTPUT_VARIABLE GIT_HASH)
 | 
					            OUTPUT_VARIABLE GIT_HASH)
 | 
				
			||||||
    if(NOT GIT_RESULT EQUAL "0")
 | 
					    if(NOT GIT_RESULT EQUAL "0")
 | 
				
			||||||
        message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}")
 | 
					        message(FATAL_ERROR "git rev-parse --short HEAD failed with ${GIT_RESULT}")
 | 
				
			||||||
    endif()
 | 
					    endif()
 | 
				
			||||||
    string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
 | 
					    string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
@@ -42,8 +42,10 @@ endif()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
find_package(OpenSSL    REQUIRED)
 | 
					find_package(OpenSSL    REQUIRED)
 | 
				
			||||||
find_package(fmt        REQUIRED)
 | 
					find_package(fmt        REQUIRED)
 | 
				
			||||||
 | 
					find_package(ZLIB       REQUIRED)
 | 
				
			||||||
find_package(Poco       REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
 | 
					find_package(Poco       REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
 | 
				
			||||||
find_package(AWSSDK     REQUIRED COMPONENTS s3)
 | 
					find_package(AWSSDK     REQUIRED COMPONENTS s3)
 | 
				
			||||||
 | 
					find_package(ZLIB       REQUIRED)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(SMALL_BUILD)
 | 
					if(SMALL_BUILD)
 | 
				
			||||||
    find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
 | 
					    find_package(Poco REQUIRED COMPONENTS Crypto JWT Net Util NetSSL Data DataSQLite)
 | 
				
			||||||
@@ -59,7 +61,7 @@ include_directories(/usr/local/include  /usr/local/opt/openssl/include src inclu
 | 
				
			|||||||
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
 | 
					configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_compile_options(-Wall -Wextra)
 | 
					add_compile_options(-Wall -Wextra)
 | 
				
			||||||
add_definitions(-DPOCO_LOG_DEBUG="1")
 | 
					add_definitions(-DPOCO_LOG_DEBUG="1" -DBOOST_NO_CXX98_FUNCTION_BASE=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(ASAN)
 | 
					if(ASAN)
 | 
				
			||||||
    add_compile_options(-fsanitize=address)
 | 
					    add_compile_options(-fsanitize=address)
 | 
				
			||||||
@@ -75,14 +77,55 @@ add_executable( owfms
 | 
				
			|||||||
        src/framework/OpenWifiTypes.h
 | 
					        src/framework/OpenWifiTypes.h
 | 
				
			||||||
        src/framework/orm.h
 | 
					        src/framework/orm.h
 | 
				
			||||||
        src/framework/StorageClass.h
 | 
					        src/framework/StorageClass.h
 | 
				
			||||||
        src/framework/ow_constants.h
 | 
					 | 
				
			||||||
        src/framework/MicroServiceErrorHandler.h
 | 
					 | 
				
			||||||
        src/framework/WebSocketClientNotifications.h
 | 
					 | 
				
			||||||
        src/framework/MicroServiceErrorHandler.h
 | 
					        src/framework/MicroServiceErrorHandler.h
 | 
				
			||||||
 | 
					        src/framework/UI_WebSocketClientServer.cpp
 | 
				
			||||||
 | 
					        src/framework/UI_WebSocketClientServer.h
 | 
				
			||||||
 | 
					        src/framework/UI_WebSocketClientNotifications.cpp
 | 
				
			||||||
 | 
					        src/framework/UI_WebSocketClientNotifications.h
 | 
				
			||||||
 | 
					        src/framework/utils.h
 | 
				
			||||||
 | 
					        src/framework/utils.cpp
 | 
				
			||||||
 | 
					        src/framework/AppServiceRegistry.h
 | 
				
			||||||
 | 
					        src/framework/SubSystemServer.cpp
 | 
				
			||||||
 | 
					        src/framework/SubSystemServer.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_utils.h
 | 
				
			||||||
 | 
					        src/framework/AuthClient.cpp
 | 
				
			||||||
 | 
					        src/framework/AuthClient.h
 | 
				
			||||||
 | 
					        src/framework/MicroServiceNames.h
 | 
				
			||||||
 | 
					        src/framework/MicroServiceFuncs.h
 | 
				
			||||||
 | 
					        src/framework/OpenAPIRequests.cpp
 | 
				
			||||||
 | 
					        src/framework/OpenAPIRequests.h
 | 
				
			||||||
 | 
					        src/framework/MicroServiceFuncs.cpp
 | 
				
			||||||
 | 
					        src/framework/ALBserver.cpp
 | 
				
			||||||
 | 
					        src/framework/ALBserver.h
 | 
				
			||||||
 | 
					        src/framework/KafkaManager.cpp
 | 
				
			||||||
 | 
					        src/framework/KafkaManager.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_RateLimiter.h
 | 
				
			||||||
 | 
					        src/framework/WebSocketLogger.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_GenericServerAccounting.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_SystemConfiguration.h
 | 
				
			||||||
 | 
					        src/framework/CIDR.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_Handler.cpp
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_Handler.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_ExtServer.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_ExtServer.cpp
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_IntServer.cpp
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_IntServer.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_SystemCommand.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_WebSocketServer.h
 | 
				
			||||||
 | 
					        src/framework/EventBusManager.cpp
 | 
				
			||||||
 | 
					        src/framework/EventBusManager.h
 | 
				
			||||||
 | 
					        src/framework/RESTAPI_PartHandler.h
 | 
				
			||||||
 | 
					        src/framework/MicroService.cpp
 | 
				
			||||||
 | 
					        src/framework/MicroServiceExtra.h
 | 
				
			||||||
 | 
					        src/framework/default_device_types.h
 | 
				
			||||||
        src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
 | 
					        src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
 | 
				
			||||||
        src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
 | 
					 | 
				
			||||||
        src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
 | 
					        src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
 | 
				
			||||||
        src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
 | 
					        src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
 | 
				
			||||||
 | 
					        src/RESTObjects/RESTAPI_CertObjects.cpp src/RESTObjects/RESTAPI_CertObjects.h
 | 
				
			||||||
 | 
					        src/RESTObjects/RESTAPI_OWLSobjects.cpp src/RESTObjects/RESTAPI_OWLSobjects.h
 | 
				
			||||||
 | 
					        src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h
 | 
				
			||||||
 | 
					        src/RESTObjects/RESTAPI_AnalyticsObjects.cpp src/RESTObjects/RESTAPI_AnalyticsObjects.h
 | 
				
			||||||
 | 
					        src/RESTObjects/RESTAPI_SubObjects.cpp src/RESTObjects/RESTAPI_SubObjects.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_firmwaresHandler.cpp src/RESTAPI/RESTAPI_firmwaresHandler.h
 | 
					        src/RESTAPI/RESTAPI_firmwaresHandler.cpp src/RESTAPI/RESTAPI_firmwaresHandler.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_firmwareHandler.cpp src/RESTAPI/RESTAPI_firmwareHandler.h
 | 
					        src/RESTAPI/RESTAPI_firmwareHandler.cpp src/RESTAPI/RESTAPI_firmwareHandler.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_historyHandler.cpp src/RESTAPI/RESTAPI_historyHandler.h
 | 
					        src/RESTAPI/RESTAPI_historyHandler.cpp src/RESTAPI/RESTAPI_historyHandler.h
 | 
				
			||||||
@@ -95,7 +138,6 @@ add_executable( owfms
 | 
				
			|||||||
        src/Daemon.cpp src/Daemon.h
 | 
					        src/Daemon.cpp src/Daemon.h
 | 
				
			||||||
        src/StorageService.cpp src/StorageService.h
 | 
					        src/StorageService.cpp src/StorageService.h
 | 
				
			||||||
        src/ManifestCreator.cpp src/ManifestCreator.h
 | 
					        src/ManifestCreator.cpp src/ManifestCreator.h
 | 
				
			||||||
        src/framework/MicroService.h
 | 
					 | 
				
			||||||
        src/NewConnectionHandler.cpp src/NewConnectionHandler.h
 | 
					        src/NewConnectionHandler.cpp src/NewConnectionHandler.h
 | 
				
			||||||
        src/LatestFirmwareCache.cpp src/LatestFirmwareCache.h
 | 
					        src/LatestFirmwareCache.cpp src/LatestFirmwareCache.h
 | 
				
			||||||
        src/DeviceCache.cpp src/DeviceCache.h
 | 
					        src/DeviceCache.cpp src/DeviceCache.h
 | 
				
			||||||
@@ -105,7 +147,9 @@ add_executable( owfms
 | 
				
			|||||||
        src/NewCommandHandler.cpp src/NewCommandHandler.h
 | 
					        src/NewCommandHandler.cpp src/NewCommandHandler.h
 | 
				
			||||||
        src/storage/orm_history.cpp src/storage/orm_history.h
 | 
					        src/storage/orm_history.cpp src/storage/orm_history.h
 | 
				
			||||||
        src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h
 | 
					        src/storage/orm_firmwares.cpp src/storage/orm_firmwares.h
 | 
				
			||||||
        src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h src/RESTAPI/RESTAPI_deviceInformation_handler.cpp src/RESTAPI/RESTAPI_deviceInformation_handler.h)
 | 
					        src/storage/orm_deviceInfo.cpp src/storage/orm_deviceInfo.h
 | 
				
			||||||
 | 
					        src/RESTAPI/RESTAPI_deviceInformation_handler.cpp
 | 
				
			||||||
 | 
					        src/RESTAPI/RESTAPI_deviceInformation_handler.h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
target_link_libraries( owfms PUBLIC
 | 
					target_link_libraries( owfms PUBLIC
 | 
				
			||||||
        ${Poco_LIBRARIES}
 | 
					        ${Poco_LIBRARIES}
 | 
				
			||||||
@@ -113,6 +157,7 @@ target_link_libraries( owfms PUBLIC
 | 
				
			|||||||
        ${ZLIB_LIBRARIES}
 | 
					        ${ZLIB_LIBRARIES}
 | 
				
			||||||
        ${AWSSDK_LINK_LIBRARIES}
 | 
					        ${AWSSDK_LINK_LIBRARIES}
 | 
				
			||||||
        fmt::fmt
 | 
					        fmt::fmt
 | 
				
			||||||
 | 
					        resolv
 | 
				
			||||||
        CppKafka::cppkafka
 | 
					        CppKafka::cppkafka
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										250
									
								
								CONFIGURATION.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,250 @@
 | 
				
			|||||||
 | 
					# OWFMS Configuration
 | 
				
			||||||
 | 
					Here is the list of parameters you can configure in the `owfms.properties` file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## OWFMS Specific Parameters
 | 
				
			||||||
 | 
					### OWFMS behaviour
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					firmwaredb.refresh = 86400
 | 
				
			||||||
 | 
					firmwaredb.maxage = 90
 | 
				
			||||||
 | 
					autoupdater.enabled = true
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					#### firmwaredb.refresh
 | 
				
			||||||
 | 
					How often to refresh the FMS DB, in seconds. Should never be less than 6 hours. It does take 10-20 minutes to 
 | 
				
			||||||
 | 
					create a refresh. The default is 24 hours. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### firmwaredb.maxage
 | 
				
			||||||
 | 
					The maximum age of firmware kept in the DB (in days). Do not go more than 6 months. The default is 3 months.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### autoupdater.enabled
 | 
				
			||||||
 | 
					The determins if the FMS autoupdates its database. You should leave this to `true`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### S3 information
 | 
				
			||||||
 | 
					The actual data for all the firmware is kept in a TIP bucket. The following parameters allow you to change the bucket.
 | 
				
			||||||
 | 
					You should never need to do this unless you need to implement your own FMS server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					s3.bucketname = ucentral-ap-firmware
 | 
				
			||||||
 | 
					s3.region = us-east-1
 | 
				
			||||||
 | 
					s3.secret = *******************************************
 | 
				
			||||||
 | 
					s3.key =  *******************************************
 | 
				
			||||||
 | 
					s3.retry = 60
 | 
				
			||||||
 | 
					s3.bucket.uri = ucentral-ap-firmware.s3.amazonaws.com
 | 
				
			||||||
 | 
					s3.endpoint.https = true
 | 
				
			||||||
 | 
					s3.endpointOverride = ""
 | 
				
			||||||
 | 
					s3.useVirtualAdressing = true
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### s3.bucketname
 | 
				
			||||||
 | 
					The S3 bucket name.
 | 
				
			||||||
 | 
					#### s3.region
 | 
				
			||||||
 | 
					The region for this bucket.
 | 
				
			||||||
 | 
					#### s3.secret
 | 
				
			||||||
 | 
					The AWS secret for access to this S3 bucket
 | 
				
			||||||
 | 
					#### s3.key
 | 
				
			||||||
 | 
					The AWS key for access for this S3 bucket
 | 
				
			||||||
 | 
					#### s3.retry = 60
 | 
				
			||||||
 | 
					The AWS retry window in seconds.
 | 
				
			||||||
 | 
					#### s3.bucket.uri = ucentral-ap-firmware.s3.amazonaws.com
 | 
				
			||||||
 | 
					The URI to the S3 bucket
 | 
				
			||||||
 | 
					#### s3.endpointOverride = ""
 | 
				
			||||||
 | 
					The Endpoint Address to override if you using a different provider that not AWS.
 | 
				
			||||||
 | 
					#### s3.endpoint.https = true
 | 
				
			||||||
 | 
					The Endpoint Method if you using a HTTP endpoint
 | 
				
			||||||
 | 
					#### s3.useVirtualAdressing = true
 | 
				
			||||||
 | 
					In a virtual-hosted–style URI, the bucket name is part of the domain name in the URL. (Not supported by all providers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Generic OpenWiFi SDK parameters
 | 
				
			||||||
 | 
					### REST API External parameters
 | 
				
			||||||
 | 
					These are the parameters required for the configuration of the external facing REST API server
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.backlog = 100
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.security = relaxed
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.rootca = $OWFMS_ROOT/certs/restapi-ca.pem
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.address = *
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.port = 16004
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.cert = $OWFMS_ROOT/certs/restapi-cert.pem
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
				
			||||||
 | 
					openwifi.restapi.host.0.key.password = mypassword
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.backlog
 | 
				
			||||||
 | 
					This is the number of concurrent REST API calls that maybe be kept in the backlog for processing. That's a good rule of thumb. Never go above 500.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.rootca
 | 
				
			||||||
 | 
					This is the root file of your own certificate CA in `pem` format.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.cert
 | 
				
			||||||
 | 
					This is your own server certificate in `pem` format..
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.key
 | 
				
			||||||
 | 
					This is the private key associated with your own certificate in `pem` format.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.address
 | 
				
			||||||
 | 
					Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.port
 | 
				
			||||||
 | 
					The port on which the REST API server is listening. By default, this is 16002.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.security
 | 
				
			||||||
 | 
					Leave this as `relaxed` for now for devices.
 | 
				
			||||||
 | 
					#### openwifi.restapi.host.0.key.password
 | 
				
			||||||
 | 
					If you key file uses a password, please enter it here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### REST API Intra microservice parameters
 | 
				
			||||||
 | 
					The following parameters describe the configuration for the inter-microservice HTTP server. You may use the same certificate/key
 | 
				
			||||||
 | 
					you are using for your extenral server or another certificate.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.backlog = 100
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.security = relaxed
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.rootca = $OWFMS_ROOT/certs/restapi-ca.pem
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.address = *
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.port = 17004
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.cert = $OWFMS_ROOT/certs/restapi-cert.pem
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
				
			||||||
 | 
					openwifi.internal.restapi.host.0.key.password = mypassword
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.backlog
 | 
				
			||||||
 | 
					This is the number of concurrent REST API calls that maybe be kept in the backlog for processing. That's a good rule of thumb. Never go above 500.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.rootca
 | 
				
			||||||
 | 
					This is the root file of your own certificate CA in `pem` format.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.cert
 | 
				
			||||||
 | 
					This is your own server certificate in `pem` format..
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.key
 | 
				
			||||||
 | 
					This is the private key associated with your own certificate in `pem` format.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.address
 | 
				
			||||||
 | 
					Leve this a `*` in the case you want to bind to all interfaces on your gateway host or select the address of a single interface.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.port
 | 
				
			||||||
 | 
					The port on which the REST API server is listening. By default, this is 17002.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.security
 | 
				
			||||||
 | 
					Leave this as `relaxed` for now for devices.
 | 
				
			||||||
 | 
					#### openwifi.internal.host.0.key.password
 | 
				
			||||||
 | 
					If you key file uses a password, please enter it here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Microservice information
 | 
				
			||||||
 | 
					These are different Microservie parameters. Following is a brief explanation.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					openwifi.service.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
				
			||||||
 | 
					openwifi.service.key.password = mypassword
 | 
				
			||||||
 | 
					openwifi.system.data = $OWFMS_ROOT/data
 | 
				
			||||||
 | 
					openwifi.system.uri.private = https://localhost:17004
 | 
				
			||||||
 | 
					openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16002
 | 
				
			||||||
 | 
					openwifi.system.uri.ui = https://ucentral-ui.arilia.com
 | 
				
			||||||
 | 
					openwifi.security.restapi.disable = false
 | 
				
			||||||
 | 
					openwifi.system.commandchannel = /tmp/app.ucentralfms
 | 
				
			||||||
 | 
					openwifi.autoprovisioning = true
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					#### openwifi.service.key
 | 
				
			||||||
 | 
					From time to time, the microservice must encrypt information. This is the key it should use. You may use the
 | 
				
			||||||
 | 
					same keey as you RESTAPI or your server.
 | 
				
			||||||
 | 
					#### openwifi.service.key.password
 | 
				
			||||||
 | 
					The password for the `openwifi.service.key`
 | 
				
			||||||
 | 
					#### openwifi.system.data
 | 
				
			||||||
 | 
					The location of system data. This path must exist.
 | 
				
			||||||
 | 
					#### openwifi.system.uri.private
 | 
				
			||||||
 | 
					The URI to reach the controller on the internal port.
 | 
				
			||||||
 | 
					#### openwifi.system.uri.public
 | 
				
			||||||
 | 
					The URI to reach the controller from the outside world.
 | 
				
			||||||
 | 
					#### openwifi.system.uri.ui
 | 
				
			||||||
 | 
					The URI of the UI to manage this service
 | 
				
			||||||
 | 
					#### openwifi.security.restapi.disable
 | 
				
			||||||
 | 
					This allows to disable security for internal and external API calls. This should only be used if the controller
 | 
				
			||||||
 | 
					sits behind an application load balancer that will actually do TLS. Setting this to `true` disables security.
 | 
				
			||||||
 | 
					#### openwifi.system.commandchannel
 | 
				
			||||||
 | 
					The UNIX socket command channel used by this service.
 | 
				
			||||||
 | 
					#### openwifi.autoprovisioning
 | 
				
			||||||
 | 
					Allow unknown devices to be provisioned by the system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### ALB Support
 | 
				
			||||||
 | 
					In order to support an application load balancer health check verification, your need to provide the following parameters.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					alb.enable = true
 | 
				
			||||||
 | 
					alb.port = 16104
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Kafka
 | 
				
			||||||
 | 
					The controller use Kafka, like all the other microservices. You must configure the kafka section in order for the
 | 
				
			||||||
 | 
					system to work.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					openwifi.kafka.group.id = firmware
 | 
				
			||||||
 | 
					openwifi.kafka.client.id = firmware1
 | 
				
			||||||
 | 
					openwifi.kafka.enable = true
 | 
				
			||||||
 | 
					openwifi.kafka.brokerlist = my_Kafka.example.com:9092
 | 
				
			||||||
 | 
					openwifi.kafka.auto.commit = false
 | 
				
			||||||
 | 
					openwifi.kafka.queue.buffering.max.ms = 50
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### openwifi.kafka.group.id
 | 
				
			||||||
 | 
					The group ID is a single word that should identify the type of service tuning. In the case `firmware`
 | 
				
			||||||
 | 
					### openwifi.kafka.client.id
 | 
				
			||||||
 | 
					The client ID is a single service within that group ID. Each participant must have a unique client ID.
 | 
				
			||||||
 | 
					### openwifi.kafka.enable
 | 
				
			||||||
 | 
					Kafka should always be enabled.
 | 
				
			||||||
 | 
					### openwifi.kafka.brokerlist
 | 
				
			||||||
 | 
					The list of servers where your Kafka server is running. Comma separated.
 | 
				
			||||||
 | 
					### openwifi.kafka.auto.commit
 | 
				
			||||||
 | 
					Auto commit flag in Kafka. Leave as `false`.
 | 
				
			||||||
 | 
					### openwifi.kafka.queue.buffering.max.ms
 | 
				
			||||||
 | 
					Kafka buffering. Leave as `50`.
 | 
				
			||||||
 | 
					### Kafka security
 | 
				
			||||||
 | 
					If you intend to use SSL, you should look into Kafka Connect and specify the certificates below.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					penwifi.kafka.ssl.ca.location =
 | 
				
			||||||
 | 
					openwifi.kafka.ssl.certificate.location =
 | 
				
			||||||
 | 
					openwifi.kafka.ssl.key.location =
 | 
				
			||||||
 | 
					openwifi.kafka.ssl.key.password =
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### DB Type
 | 
				
			||||||
 | 
					The controller supports 3 types of Database. SQLite should only be used for sites with less than 100 APs or for testing in the lab.
 | 
				
			||||||
 | 
					In order to select which database to use, you must set the `storage.type` value to sqlite, postgresql, or mysql.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					storage.type = sqlite
 | 
				
			||||||
 | 
					#storage.type = postgresql
 | 
				
			||||||
 | 
					#storage.type = mysql
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Storage SQLite parameters
 | 
				
			||||||
 | 
					Additional parameters to set for SQLite. The only important one is `storage.type.sqlite.db` which is the database name on disk.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					storage.type.sqlite.db = firmware.db
 | 
				
			||||||
 | 
					storage.type.sqlite.idletime = 120
 | 
				
			||||||
 | 
					storage.type.sqlite.maxsessions = 128
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Storage Postgres
 | 
				
			||||||
 | 
					Additional parameters to set if you select Postgres for your database. You must specify `host`, `username`, `password`,
 | 
				
			||||||
 | 
					`database`, and `port`.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					storage.type.postgresql.maxsessions = 64
 | 
				
			||||||
 | 
					storage.type.postgresql.idletime = 60
 | 
				
			||||||
 | 
					storage.type.postgresql.host = localhost
 | 
				
			||||||
 | 
					storage.type.postgresql.username = firmware
 | 
				
			||||||
 | 
					storage.type.postgresql.password = firmware
 | 
				
			||||||
 | 
					storage.type.postgresql.database = firmware
 | 
				
			||||||
 | 
					storage.type.postgresql.port = 5432
 | 
				
			||||||
 | 
					storage.type.postgresql.connectiontimeout = 60
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Storage MySQL/MariaDB
 | 
				
			||||||
 | 
					Additional parameters to set if you select mysql for your database. You must specify `host`, `username`, `password`,
 | 
				
			||||||
 | 
					`database`, and `port`.
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					storage.type.mysql.maxsessions = 64
 | 
				
			||||||
 | 
					storage.type.mysql.idletime = 60
 | 
				
			||||||
 | 
					storage.type.mysql.host = localhost
 | 
				
			||||||
 | 
					storage.type.postgresql.username = firmware
 | 
				
			||||||
 | 
					storage.type.postgresql.password = firmware
 | 
				
			||||||
 | 
					storage.type.postgresql.database = firmware
 | 
				
			||||||
 | 
					storage.type.mysql.port = 3306
 | 
				
			||||||
 | 
					storage.type.mysql.connectiontimeout = 60
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Logging Parameters
 | 
				
			||||||
 | 
					The microservice provides extensive logging. If you would like to keep logging on disk, set the `logging.type = file`. If you only want
 | 
				
			||||||
 | 
					console logging, `set logging.type = console`. When selecting file, `logging.path` must exist. `logging.level` sets the
 | 
				
			||||||
 | 
					basic logging level for the entire controller. `logging.websocket` disables WebSocket logging.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```properties
 | 
				
			||||||
 | 
					logging.type = file
 | 
				
			||||||
 | 
					logging.path = $OWFMS_ROOT/logs
 | 
				
			||||||
 | 
					logging.level = information
 | 
				
			||||||
 | 
					logging.asynch = true
 | 
				
			||||||
 | 
					logging.websocket = false
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										38
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					# How to Contribute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We'd love to accept your patches and contributions to this project. There are
 | 
				
			||||||
 | 
					just a few small guidelines you need to follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Version of C++
 | 
				
			||||||
 | 
					This project is based on the C++17 standard and compiles as-is on most platforms 
 | 
				
			||||||
 | 
					using either clang or g++. Do not use C++21 or C++23 features for now. Some core 
 | 
				
			||||||
 | 
					libraries used in this project do not support C++21 or C++23 yet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Variable Naming
 | 
				
			||||||
 | 
					Naming of pretty much anything uses Pascal naming. Longer explicit names using casing. 
 | 
				
			||||||
 | 
					Member variable naming adds a `_` at the end of the vars. Try to
 | 
				
			||||||
 | 
					keep this standard going. Sometimes you must override a base class function and then of course
 | 
				
			||||||
 | 
					you need to follow the base class.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## This is a cmake project
 | 
				
			||||||
 | 
					This is a cmake project, and you need to adhere to the cmake rules. If you need
 | 
				
			||||||
 | 
					to add a package to the CMakeList, you need to ensure that the package is available
 | 
				
			||||||
 | 
					on all required platforms and compiles. Remember that this project runs on Linux, OS X, 
 | 
				
			||||||
 | 
					and the Raspberry PI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Licensed packages
 | 
				
			||||||
 | 
					When adding a package, you must also state the licensing for the package. MIT, BSD, Apache licenses
 | 
				
			||||||
 | 
					are acceptable. No commercial licenses are allowed. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## clang formatting
 | 
				
			||||||
 | 
					Please format your code using the included `.clang-format` file included in the project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					clang-format -i --style=<project root>/.clang-format myfile.cpp
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Pull Requests
 | 
				
			||||||
 | 
					All submissions, including submissions by project members, require review. We
 | 
				
			||||||
 | 
					accept GitHub pull requests. Please create a branch with the Jira name for addressing the issue you are fixing or the 
 | 
				
			||||||
 | 
					feature you are implementing.
 | 
				
			||||||
 | 
					Create a pull-request from the branch into master. 
 | 
				
			||||||
							
								
								
									
										135
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						@@ -1,24 +1,23 @@
 | 
				
			|||||||
ARG DEBIAN_VERSION=11.4-slim
 | 
					ARG DEBIAN_VERSION=11.5-slim
 | 
				
			||||||
ARG POCO_VERSION=poco-tip-v1
 | 
					ARG POCO_VERSION=poco-tip-v2
 | 
				
			||||||
ARG FMTLIB_VERSION=9.0.0
 | 
					 | 
				
			||||||
ARG CPPKAFKA_VERSION=tip-v1
 | 
					ARG CPPKAFKA_VERSION=tip-v1
 | 
				
			||||||
ARG JSON_VALIDATOR_VERSION=2.1.0
 | 
					ARG VALIJASON_VERSION=tip-v1
 | 
				
			||||||
ARG AWS_SDK_VERSION=1.9.315
 | 
					ARG APP_NAME=owfms
 | 
				
			||||||
 | 
					ARG APP_HOME_DIR=/openwifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM debian:$DEBIAN_VERSION AS build-base
 | 
					FROM debian:$DEBIAN_VERSION AS build-base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apt-get update && apt-get install --no-install-recommends -y \
 | 
					RUN apt-get update && apt-get install --no-install-recommends -y \
 | 
				
			||||||
    make cmake g++ git \
 | 
					    make cmake g++ git curl zip unzip pkg-config \
 | 
				
			||||||
    libpq-dev libmariadb-dev libmariadbclient-dev-compat \
 | 
					    libpq-dev libmariadb-dev libmariadbclient-dev-compat \
 | 
				
			||||||
    librdkafka-dev libboost-all-dev libssl-dev \
 | 
					    librdkafka-dev libboost-all-dev libssl-dev \
 | 
				
			||||||
    zlib1g-dev nlohmann-json3-dev ca-certificates libcurl4-openssl-dev
 | 
					    zlib1g-dev ca-certificates libcurl4-openssl-dev libfmt-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM build-base AS poco-build
 | 
					FROM build-base AS poco-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARG POCO_VERSION
 | 
					ARG POCO_VERSION
 | 
				
			||||||
 | 
					ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-poco/git/refs/tags/${POCO_VERSION} version.json
 | 
				
			||||||
ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json
 | 
					RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch ${POCO_VERSION} /poco
 | 
				
			||||||
RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /poco
 | 
					WORKDIR /poco
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
@@ -27,26 +26,12 @@ RUN cmake ..
 | 
				
			|||||||
RUN cmake --build . --config Release -j8
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
RUN cmake --build . --target install
 | 
					RUN cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM build-base AS fmtlib-build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ARG FMTLIB_VERSION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ADD https://api.github.com/repos/fmtlib/fmt/git/refs/tags/${FMTLIB_VERSION} version.json
 | 
					 | 
				
			||||||
RUN git clone https://github.com/fmtlib/fmt --branch ${FMTLIB_VERSION} /fmtlib
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
WORKDIR /fmtlib
 | 
					 | 
				
			||||||
RUN mkdir cmake-build
 | 
					 | 
				
			||||||
WORKDIR cmake-build
 | 
					 | 
				
			||||||
RUN cmake ..
 | 
					 | 
				
			||||||
RUN make
 | 
					 | 
				
			||||||
RUN make install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FROM build-base AS cppkafka-build
 | 
					FROM build-base AS cppkafka-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARG CPPKAFKA_VERSION
 | 
					ARG CPPKAFKA_VERSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
 | 
					ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json
 | 
				
			||||||
RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
 | 
					RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /cppkafka
 | 
					WORKDIR /cppkafka
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
@@ -55,99 +40,73 @@ RUN cmake ..
 | 
				
			|||||||
RUN cmake --build . --config Release -j8
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
RUN cmake --build . --target install
 | 
					RUN cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM build-base AS json-schema-validator-build
 | 
					FROM build-base AS app-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARG JSON_VALIDATOR_VERSION
 | 
					ARG APP_NAME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/tags/${JSON_VALIDATOR_VERSION} version.json
 | 
					ADD CMakeLists.txt build /${APP_NAME}/
 | 
				
			||||||
RUN git clone https://github.com/pboettch/json-schema-validator --branch ${JSON_VALIDATOR_VERSION} /json-schema-validator
 | 
					ADD overlays /${APP_NAME}/overlays
 | 
				
			||||||
 | 
					ADD cmake /${APP_NAME}/cmake
 | 
				
			||||||
 | 
					ADD src /${APP_NAME}/src
 | 
				
			||||||
 | 
					ADD .git /${APP_NAME}/.git
 | 
				
			||||||
 | 
					ARG VCPKG_VERSION=2022.11.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /json-schema-validator
 | 
					RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					    ./vcpkg/bootstrap-vcpkg.sh && \
 | 
				
			||||||
WORKDIR cmake-build
 | 
					    mkdir /vcpkg/custom-triplets && \
 | 
				
			||||||
RUN cmake ..
 | 
					    cp /vcpkg/triplets/x64-linux.cmake /vcpkg/custom-triplets/x64-linux.cmake && \
 | 
				
			||||||
RUN make
 | 
					    sed -i 's/set(VCPKG_LIBRARY.*/set(VCPKG_LIBRARY_LINKAGE dynamic)/g' /vcpkg/custom-triplets/x64-linux.cmake && \
 | 
				
			||||||
RUN make install
 | 
					    ./vcpkg/vcpkg install aws-sdk-cpp[s3]:x64-linux json-schema-validator:x64-linux --overlay-triplets=/vcpkg/custom-triplets --overlay-ports=/owfms/overlays
 | 
				
			||||||
 | 
					 | 
				
			||||||
FROM build-base AS aws-sdk-cpp-build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ARG AWS_SDK_VERSION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ADD https://api.github.com/repos/aws/aws-sdk-cpp/git/refs/tags/${AWS_SDK_VERSION} version.json
 | 
					 | 
				
			||||||
RUN git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp --branch ${AWS_SDK_VERSION} /aws-sdk-cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
WORKDIR /aws-sdk-cpp
 | 
					 | 
				
			||||||
RUN mkdir cmake-build
 | 
					 | 
				
			||||||
WORKDIR cmake-build
 | 
					 | 
				
			||||||
RUN cmake .. -DBUILD_ONLY="sns;s3" \
 | 
					 | 
				
			||||||
             -DCMAKE_BUILD_TYPE=Release \
 | 
					 | 
				
			||||||
             -DUSE_OPENSSL=ON \
 | 
					 | 
				
			||||||
             -DCPP_STANDARD=17 \
 | 
					 | 
				
			||||||
             -DBUILD_SHARED_LIBS=ON \
 | 
					 | 
				
			||||||
             -DCMAKE_CXX_FLAGS="-Wno-error=stringop-overflow -Wno-error=uninitialized" \
 | 
					 | 
				
			||||||
             -DAUTORUN_UNIT_TESTS=OFF
 | 
					 | 
				
			||||||
RUN cmake --build . --config Release -j8
 | 
					 | 
				
			||||||
RUN cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
FROM build-base AS owfms-build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ADD CMakeLists.txt build /owfms/
 | 
					 | 
				
			||||||
ADD cmake /owfms/cmake
 | 
					 | 
				
			||||||
ADD src /owfms/src
 | 
					 | 
				
			||||||
ADD .git /owfms/.git
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=poco-build /usr/local/include /usr/local/include
 | 
					COPY --from=poco-build /usr/local/include /usr/local/include
 | 
				
			||||||
COPY --from=poco-build /usr/local/lib /usr/local/lib
 | 
					COPY --from=poco-build /usr/local/lib /usr/local/lib
 | 
				
			||||||
COPY --from=cppkafka-build /usr/local/include /usr/local/include
 | 
					COPY --from=cppkafka-build /usr/local/include /usr/local/include
 | 
				
			||||||
COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
 | 
					COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
 | 
				
			||||||
COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
 | 
					 | 
				
			||||||
COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
 | 
					 | 
				
			||||||
COPY --from=aws-sdk-cpp-build /usr/local/include /usr/local/include
 | 
					 | 
				
			||||||
COPY --from=aws-sdk-cpp-build /usr/local/lib /usr/local/lib
 | 
					 | 
				
			||||||
COPY --from=fmtlib-build /usr/local/include /usr/local/include
 | 
					 | 
				
			||||||
COPY --from=fmtlib-build /usr/local/lib /usr/local/lib
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /owfms
 | 
					WORKDIR /${APP_NAME}
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
WORKDIR /owfms/cmake-build
 | 
					WORKDIR /${APP_NAME}/cmake-build
 | 
				
			||||||
RUN cmake ..
 | 
					RUN cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake ..
 | 
				
			||||||
RUN cmake --build . --config Release -j8
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM debian:$DEBIAN_VERSION
 | 
					FROM debian:$DEBIAN_VERSION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV OWFMS_USER=owfms \
 | 
					ARG APP_NAME
 | 
				
			||||||
    OWFMS_ROOT=/owfms-data \
 | 
					ARG APP_HOME_DIR
 | 
				
			||||||
    OWFMS_CONFIG=/owfms-data
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN useradd "$OWFMS_USER"
 | 
					ENV APP_NAME=$APP_NAME \
 | 
				
			||||||
 | 
					    APP_USER=$APP_NAME \
 | 
				
			||||||
 | 
					    APP_ROOT=/$APP_NAME-data \
 | 
				
			||||||
 | 
					    APP_CONFIG=/$APP_NAME-data \
 | 
				
			||||||
 | 
					    APP_HOME_DIR=$APP_HOME_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN mkdir /openwifi
 | 
					RUN useradd $APP_USER
 | 
				
			||||||
RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \
 | 
					
 | 
				
			||||||
    chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG"
 | 
					RUN mkdir $APP_HOME_DIR
 | 
				
			||||||
 | 
					RUN mkdir -p "$APP_ROOT" "$APP_CONFIG" && \
 | 
				
			||||||
 | 
					    chown "$APP_USER": "$APP_ROOT" "$APP_CONFIG"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apt-get update && apt-get install --no-install-recommends -y \
 | 
					RUN apt-get update && apt-get install --no-install-recommends -y \
 | 
				
			||||||
    librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
 | 
					    librdkafka++1 gosu gettext ca-certificates bash jq curl wget \
 | 
				
			||||||
    libmariadb-dev-compat libpq5 unixodbc postgresql-client
 | 
					    libmariadb-dev-compat libpq5 postgresql-client libfmt7 sqlite3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY readiness_check /readiness_check
 | 
					COPY readiness_check /readiness_check
 | 
				
			||||||
COPY test_scripts/curl/cli /cli
 | 
					COPY test_scripts/curl/cli /cli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY owfms.properties.tmpl /
 | 
					COPY $APP_NAME.properties.tmpl /
 | 
				
			||||||
COPY docker-entrypoint.sh /
 | 
					COPY docker-entrypoint.sh /
 | 
				
			||||||
COPY wait-for-postgres.sh /
 | 
					COPY wait-for-postgres.sh /
 | 
				
			||||||
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
 | 
					RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
 | 
				
			||||||
    -O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
 | 
					    -O /usr/local/share/ca-certificates/restapi-ca-selfsigned.crt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms
 | 
					COPY --from=app-build /$APP_NAME/cmake-build/$APP_NAME $APP_HOME_DIR/$APP_NAME
 | 
				
			||||||
COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/* /usr/local/lib
 | 
					COPY --from=app-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/
 | 
				
			||||||
COPY --from=poco-build /poco/cmake-build/lib/* /usr/local/lib
 | 
					COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/
 | 
				
			||||||
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-core/libaws-cpp-sdk-core.so /usr/local/lib
 | 
					COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/
 | 
				
			||||||
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so /usr/local/lib
 | 
					 | 
				
			||||||
COPY --from=aws-sdk-cpp-build /aws-sdk-cpp/cmake-build/aws-cpp-sdk-sns/libaws-cpp-sdk-sns.so /usr/local/lib
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN ldconfig
 | 
					RUN ldconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPOSE 16004 17004 16104
 | 
					EXPOSE 16004 17004 16104
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRYPOINT ["/docker-entrypoint.sh"]
 | 
					ENTRYPOINT ["/docker-entrypoint.sh"]
 | 
				
			||||||
CMD ["/openwifi/owfms"]
 | 
					CMD ${APP_HOME_DIR}/${APP_NAME}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										252
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,3 +1,7 @@
 | 
				
			|||||||
 | 
					<p align="center">
 | 
				
			||||||
 | 
					    <img src="images/project/logo.svg" width="200"/>
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# uCentralFMS
 | 
					# uCentralFMS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## What is this?
 | 
					## What is this?
 | 
				
			||||||
@@ -5,215 +9,87 @@ The uCentralFMS is a micro-service part of the OpenWiFi ecosystem. uCentralFMS i
 | 
				
			|||||||
to facilitate the task of upgrade and maintaining the proper firmware for all the devices 
 | 
					to facilitate the task of upgrade and maintaining the proper firmware for all the devices 
 | 
				
			||||||
used in your OpenWiFi solution. You may either [build it](#building) or use the [Docker version](#docker).
 | 
					used in your OpenWiFi solution. You may either [build it](#building) or use the [Docker version](#docker).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## OpenAPI
 | 
				
			||||||
 | 
					You may get static page with OpenAPI docs generated from the definition on [GitHub Page](https://telecominfraproject.github.io/wlan-cloud-ucentralfms/).
 | 
				
			||||||
 | 
					Also, you may use [Swagger UI](https://petstore.swagger.io/#/) with OpenAPI definition file raw link (i.e. [latest version file](https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentralfms/main/openapi/owfms.yaml)) to get interactive docs page.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Building
 | 
					## Building
 | 
				
			||||||
In order to build the uCentralFMS, you will need to install its dependencies, which includes the following:
 | 
					To build the microservice from source, please follow the instructions in [here](./BUILDING.md)
 | 
				
			||||||
- cmake
 | 
					 | 
				
			||||||
- boost
 | 
					 | 
				
			||||||
- POCO 1.10.1 or later
 | 
					 | 
				
			||||||
- a C++17 compiler
 | 
					 | 
				
			||||||
- openssl
 | 
					 | 
				
			||||||
- libpq-dev (PortgreSQL development libraries)
 | 
					 | 
				
			||||||
- mysql-client (MySQL client)
 | 
					 | 
				
			||||||
- librdkafka
 | 
					 | 
				
			||||||
- cppkafka
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Building is a 2 part process. The first part is to build a local copy of the framework tailored to your environment. This
 | 
					## Docker
 | 
				
			||||||
framework is [Poco](https://github.com/pocoproject/poco). The version used in this project has a couple of fixes
 | 
					To use the CLoudSDK deployment please follow [here](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy)
 | 
				
			||||||
from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/stephb9959/poco). Building
 | 
					 | 
				
			||||||
Poco may take several minutes depending on the platform you are building on.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Ubuntu
 | 
					 | 
				
			||||||
These instructions have proven to work on Ubuntu 20.4.
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
sudo apt install git cmake g++ libssl-dev libmariabd-dev unixodbc-dev 
 | 
					 | 
				
			||||||
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
 | 
					 | 
				
			||||||
sudo apt install librdkafka-dev liblua5.3-dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/poco
 | 
					 | 
				
			||||||
cd poco
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/cppkafka
 | 
					 | 
				
			||||||
cd cppkafka
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cd ~
 | 
					 | 
				
			||||||
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
 | 
					 | 
				
			||||||
cd wlan-cloud-ucentralgw
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
make
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fedora
 | 
					 | 
				
			||||||
The following instructions have proven to work on Fedora 33
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
sudo yum install cmake g++ openssl-devel unixODBC-devel mysql-devel mysql apr-util-devel boost boost-devel
 | 
					 | 
				
			||||||
sudo yum install yaml-cpp-devel lua-devel 
 | 
					 | 
				
			||||||
sudo dnf install postgresql.x86_64 librdkafka-devel
 | 
					 | 
				
			||||||
sudo dnf install postgresql-devel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/poco
 | 
					 | 
				
			||||||
cd poco
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/cppkafka
 | 
					 | 
				
			||||||
cd cppkafka
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cd ~
 | 
					 | 
				
			||||||
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralfms
 | 
					 | 
				
			||||||
cd wlan-cloud-ucentralfms
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
make
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### OSX Build
 | 
					 | 
				
			||||||
The following instructions have proven to work on OSX Big Sur. You need to install [Homebrew](https://brew.sh/). You must also have installed [XCode for OS X](https://www.freecodecamp.org/news/how-to-download-and-install-xcode/).
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
brew install openssl
 | 
					 | 
				
			||||||
brew install cmake
 | 
					 | 
				
			||||||
brew install libpq
 | 
					 | 
				
			||||||
brew install mysql-client
 | 
					 | 
				
			||||||
brew install apr
 | 
					 | 
				
			||||||
brew install apr-util
 | 
					 | 
				
			||||||
brew install boost
 | 
					 | 
				
			||||||
brew install yaml-cpp
 | 
					 | 
				
			||||||
brew install postgresql
 | 
					 | 
				
			||||||
brew install unixodbc
 | 
					 | 
				
			||||||
brew install librdkafka
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/poco
 | 
					 | 
				
			||||||
cd poco
 | 
					 | 
				
			||||||
mkdir cmake-build 
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release -j
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git clone https://github.com/stephb9959/cppkafka
 | 
					 | 
				
			||||||
cd cppkafka
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
cmake --build . --config Release
 | 
					 | 
				
			||||||
sudo cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cd ~
 | 
					 | 
				
			||||||
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralfms
 | 
					 | 
				
			||||||
cd wlan-cloud-ucentralfms
 | 
					 | 
				
			||||||
mkdir cmake-build
 | 
					 | 
				
			||||||
cd cmake-build
 | 
					 | 
				
			||||||
cmake ..
 | 
					 | 
				
			||||||
make -j
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### After completing the build
 | 
					 | 
				
			||||||
After completing the build, you can remove the Poco source as it is no longer needed.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Expected directory layout
 | 
					#### Expected directory layout
 | 
				
			||||||
From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `data`.
 | 
					From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `uploads` directories.
 | 
				
			||||||
```shell
 | 
					```bash
 | 
				
			||||||
mkdir certs
 | 
					mkdir certs
 | 
				
			||||||
 | 
					mkdir certs/cas
 | 
				
			||||||
mkdir logs
 | 
					mkdir logs
 | 
				
			||||||
mkdir data
 | 
					mkdir uploads
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					You should now have the following:
 | 
				
			||||||
 | 
					```text
 | 
				
			||||||
 | 
					--+-- certs
 | 
				
			||||||
 | 
					  |   +--- cas
 | 
				
			||||||
 | 
					  +-- cmake
 | 
				
			||||||
 | 
					  +-- cmake-build
 | 
				
			||||||
 | 
					  +-- logs
 | 
				
			||||||
 | 
					  +-- src
 | 
				
			||||||
 | 
					  +-- test_scripts
 | 
				
			||||||
 | 
					  +-- openapi
 | 
				
			||||||
 | 
					  +-- uploads
 | 
				
			||||||
 | 
					  +-- owsec.properties
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Certificates
 | 
					### Certificate
 | 
				
			||||||
Love'em of hate'em, we gotta use'em. So we tried to make this as easy as possible for you.
 | 
					The OWFMS uses a certificate to provide security for the REST API Certificate to secure the Northbound API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### The `certs` directory
 | 
					#### The `certs` directory
 | 
				
			||||||
For all deployments, you will need the following `certs` directory, populated with the proper files.
 | 
					For all deployments, you will need the following `certs` directory, populated with the proper files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```asm
 | 
					```text
 | 
				
			||||||
certs ---+--- 
 | 
					certs ---+--- restapi-ca.pem
 | 
				
			||||||
         +--- restapi-ca.pem
 | 
					 | 
				
			||||||
         +--- restapi-cert.pem
 | 
					         +--- restapi-cert.pem
 | 
				
			||||||
         +--- restapi-key.pem
 | 
					         +--- restapi-key.pem
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Configuration
 | 
					## Firewall Considerations
 | 
				
			||||||
The configuration is kep in the file `owfms.properties`. This is a text file read by the service at startup time.
 | 
					| Port  | Description                                   | Configurable |
 | 
				
			||||||
 | 
					|:------|:----------------------------------------------|:------------:|
 | 
				
			||||||
 | 
					| 16003 | Default port for REST API Access to the OWFMS |     yes      |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Basic configuration
 | 
					### Environment variables
 | 
				
			||||||
You must set the environment variables:
 | 
					The following environment variables should be set from the root directory of the service. They tell the OWGW process where to find
 | 
				
			||||||
- OWFMS_ROOT: represents where the root of the installation is for this service.
 | 
					the configuration and the root directory.
 | 
				
			||||||
- OWFMS_CONFIG: represents the path where the configuration is kept.
 | 
					```bash
 | 
				
			||||||
 | 
					export OWGW_ROOT=`pwd`
 | 
				
			||||||
#### The file section
 | 
					export OWGW_CONFIG=`pwd`
 | 
				
			||||||
#### RESTAPI
 | 
					 | 
				
			||||||
```json
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.backlog = 100
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.security = relaxed
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.rootca = $OWFMS_ROOT/certs/restapi-ca.pem
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.address = *
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.port = 16004
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.cert = $OWFMS_ROOT/certs/restapi-cert.pem
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
					 | 
				
			||||||
openwifi.restapi.host.0.key.password = mypassword
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Of importance are the `.port` which should point to the port used.
 | 
					You can run the shell script `set_env.sh` from the microservice root.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Internal microservice interface
 | 
					### OWFMS Service Configuration
 | 
				
			||||||
```json
 | 
					The configuration is kept in a file called `owfms.properties`. To understand the content of this file,
 | 
				
			||||||
openwifi.internal.restapi.host.0.backlog = 100
 | 
					please look [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms/blob/main/CONFIGURATION.md)
 | 
				
			||||||
openwifi.internal.restapi.host.0.security = relaxed
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.rootca = $OWFMS_ROOT/certs/restapi-ca.pem
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.address = *
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.port = 17004
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.cert = $OWFMS_ROOT/certs/restapi-cert.pem
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
					 | 
				
			||||||
openwifi.internal.restapi.host.0.key.password = mypassword
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
You can leave all the default values for this one. 
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### System values
 | 
					## Kafka topics
 | 
				
			||||||
In the following values, you need to change `.uri.public` and `uri.ui`. The `.uri.public` must point to an externally available FQDN to access the service. The `.uri.ui` must point to web server running 
 | 
					Toe read more about Kafka, follow the [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/KAFKA.md)
 | 
				
			||||||
the UI for the service. `firmwaredb.refresh` tells the service how often to refresh the firmware database in seconds. `firmwaredb.maxage` tells the service how old you
 | 
					 | 
				
			||||||
want to accept release for. This value is in days.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
```json
 | 
					## Contributions
 | 
				
			||||||
openwifi.service.key = $OWFMS_ROOT/certs/restapi-key.pem
 | 
					We need more contributors. Should you wish to contribute,
 | 
				
			||||||
openwifi.service.key.password = mypassword
 | 
					please follow the [contributions](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CONTRIBUTING.md) document.
 | 
				
			||||||
openwifi.system.data = $OWFMS_ROOT/data
 | 
					 | 
				
			||||||
openwifi.system.debug = false
 | 
					 | 
				
			||||||
openwifi.system.uri.private = https://localhost:17004
 | 
					 | 
				
			||||||
openwifi.system.uri.public = https://ucentral.dpaas.arilia.com:16004
 | 
					 | 
				
			||||||
openwifi.system.commandchannel = /tmp/app.owfms
 | 
					 | 
				
			||||||
openwifi.system.uri.ui = ucentral-ui.arilia.com
 | 
					 | 
				
			||||||
firmwaredb.refresh = 1800
 | 
					 | 
				
			||||||
firmwaredb.maxage = 90
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### S3 configuration
 | 
					## Pull Requests
 | 
				
			||||||
The service mua read the information about firmware from an Amazon S3 Bucket. You need to replace `s3.secret` and `s3.key` with your own. 
 | 
					Please create a branch with the Jira addressing the issue you are fixing or the feature you are implementing.
 | 
				
			||||||
 | 
					Create a pull-request from the branch into master.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```json
 | 
					## Additional OWSDK Microservices
 | 
				
			||||||
s3.bucketname = ucentral-ap-firmware
 | 
					Here is a list of additional OWSDK microservices
 | 
				
			||||||
s3.region = us-east-1
 | 
					| Name | Description | Link | OpenAPI |
 | 
				
			||||||
s3.secret = *******************************************
 | 
					| :--- | :--- | :---: | :---: |
 | 
				
			||||||
s3.key =  *******************************************
 | 
					| OWSEC | Security Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralsec) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralsec/blob/main/openpapi/owsec.yaml) |
 | 
				
			||||||
s3.retry = 60
 | 
					| OWGW | Controller Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/openapi/owgw.yaml) |
 | 
				
			||||||
s3.bucket.uri = ucentral-ap-firmware.s3.amazonaws.com
 | 
					| OWFMS | Firmware Management Service | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms) | [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms/blob/main/openapi/owfms.yaml) |
 | 
				
			||||||
 | 
					| OWPROV | Provisioning Service | [here](https://github.com/Telecominfraproject/wlan-cloud-owprov) | [here](https://github.com/Telecominfraproject/wlan-cloud-owprov/blob/main/openapi/owprov.yaml) |
 | 
				
			||||||
 | 
					| OWANALYTICS | Analytics Service | [here](https://github.com/Telecominfraproject/wlan-cloud-analytics) | [here](https://github.com/Telecominfraproject/wlan-cloud-analytics/blob/main/openapi/owanalytics.yaml) |
 | 
				
			||||||
 | 
					| OWSUB | Subscriber Service | [here](https://github.com/Telecominfraproject/wlan-cloud-userportal) | [here](https://github.com/Telecominfraproject/wlan-cloud-userportal/blob/main/openapi/userportal.yaml) |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					 | 
				
			||||||
@@ -23,6 +23,11 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
 | 
				
			|||||||
  SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \
 | 
					  SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16004"} \
 | 
				
			||||||
  SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
 | 
					  SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
 | 
				
			||||||
  SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \
 | 
					  SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \
 | 
				
			||||||
 | 
					  FIRMWAREDB_REFRESH=${FIRMWAREDB_REFRESH:-"86400"} \
 | 
				
			||||||
 | 
					  FIRMWAREDB_MAXAGE=${FIRMWAREDB_MAXAGE:-"90"} \
 | 
				
			||||||
 | 
					  S3_VIRTUAL_ADRESSING=${S3_VIRTUAL_ADRESSING:-"true"} \
 | 
				
			||||||
 | 
					  S3_HTTPS=${S3_HTTPS:-"true"} \
 | 
				
			||||||
 | 
					  S3_ENDPOINT=${S3_ENDPOINT:-""} \
 | 
				
			||||||
  S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \
 | 
					  S3_BUCKETNAME=${S3_BUCKETNAME:-"ucentral-ap-firmware"} \
 | 
				
			||||||
  S3_REGION=${S3_REGION:-"us-east-1"} \
 | 
					  S3_REGION=${S3_REGION:-"us-east-1"} \
 | 
				
			||||||
  S3_SECRET=${S3_SECRET:-"*******************************************"} \
 | 
					  S3_SECRET=${S3_SECRET:-"*******************************************"} \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,11 +143,14 @@ configProperties:
 | 
				
			|||||||
  openwifi.internal.restapi.host.0.cert: $OWFMS_ROOT/certs/restapi-cert.pem
 | 
					  openwifi.internal.restapi.host.0.cert: $OWFMS_ROOT/certs/restapi-cert.pem
 | 
				
			||||||
  openwifi.internal.restapi.host.0.key: $OWFMS_ROOT/certs/restapi-key.pem
 | 
					  openwifi.internal.restapi.host.0.key: $OWFMS_ROOT/certs/restapi-key.pem
 | 
				
			||||||
  # Firmware Microservice Specific Section
 | 
					  # Firmware Microservice Specific Section
 | 
				
			||||||
 | 
					  s3.endpointOverride: ""
 | 
				
			||||||
 | 
					  s3.useVirtualAdressing: true
 | 
				
			||||||
 | 
					  s3.endpoint.https: true
 | 
				
			||||||
  s3.bucketname: ucentral-ap-firmware
 | 
					  s3.bucketname: ucentral-ap-firmware
 | 
				
			||||||
  s3.region: us-east-1
 | 
					  s3.region: us-east-1
 | 
				
			||||||
  s3.retry: 60
 | 
					  s3.retry: 60
 | 
				
			||||||
  s3.bucket.uri: ucentral-ap-firmware.s3.amazonaws.com
 | 
					  s3.bucket.uri: ucentral-ap-firmware.s3.amazonaws.com
 | 
				
			||||||
  firmwaredb.refresh: 1800
 | 
					  firmwaredb.refresh: 86400
 | 
				
			||||||
  # ALB
 | 
					  # ALB
 | 
				
			||||||
  alb.enable: "true"
 | 
					  alb.enable: "true"
 | 
				
			||||||
  alb.port: 16104
 | 
					  alb.port: 16104
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf160d.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 104 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf188.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf188n.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf194c.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 75 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf194c4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 75 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf808.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 218 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf809.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 158 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_eap101.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 140 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_eap102.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 121 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecs4100-12ph.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 44 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecw5211.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 192 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecw5410.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 197 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_oap100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 50 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_spw2ac1200-lan-poe.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_spw2ac1200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ssw2ac2600.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 51 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/hfcl_ion4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/hfcl_ion4.yml.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/indio_um-305ac.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 34 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_e8450-ubi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 98 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea6350-v4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea6350.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea8300.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 204 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tp-link_ec420-g1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 159 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ec420.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 159 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex227.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex228.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex447.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr40x9.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr6018.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr6018_v4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/project/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.8 KiB  | 
							
								
								
									
										165
									
								
								images/project/logo.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,165 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
				
			||||||
 | 
					<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
				
			||||||
 | 
						 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
				
			||||||
 | 
					<style type="text/css">
 | 
				
			||||||
 | 
						.st0{fill:#414141;}
 | 
				
			||||||
 | 
						.st1{fill:#FFFFFF;}
 | 
				
			||||||
 | 
						.st2{fill:#FED206;}
 | 
				
			||||||
 | 
						.st3{fill:#EB6F53;}
 | 
				
			||||||
 | 
						.st4{fill:#3BA9B6;}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
						<g>
 | 
				
			||||||
 | 
							<path class="st0" d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2
 | 
				
			||||||
 | 
								c10.8,0,19.5,8.7,19.5,19.5v143.9C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
				
			||||||
 | 
							<g>
 | 
				
			||||||
 | 
								<g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
 | 
				
			||||||
 | 
											c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
 | 
				
			||||||
 | 
											C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
 | 
				
			||||||
 | 
											 M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
 | 
				
			||||||
 | 
											 M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
 | 
				
			||||||
 | 
											c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
 | 
				
			||||||
 | 
											 M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
 | 
				
			||||||
 | 
											C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
 | 
				
			||||||
 | 
											C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
				
			||||||
 | 
											C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
 | 
				
			||||||
 | 
											c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
 | 
				
			||||||
 | 
											C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st1" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
								</g>
 | 
				
			||||||
 | 
								<g>
 | 
				
			||||||
 | 
									<polygon class="st1" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 				"/>
 | 
				
			||||||
 | 
									<polygon class="st1" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 				"/>
 | 
				
			||||||
 | 
									<polygon class="st1" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 				"/>
 | 
				
			||||||
 | 
									<polygon class="st1" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 				"/>
 | 
				
			||||||
 | 
								</g>
 | 
				
			||||||
 | 
							</g>
 | 
				
			||||||
 | 
							<g>
 | 
				
			||||||
 | 
								<path class="st1" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
				
			||||||
 | 
							</g>
 | 
				
			||||||
 | 
							<g>
 | 
				
			||||||
 | 
								<g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st2" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
 | 
				
			||||||
 | 
											l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
				
			||||||
 | 
											c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
								</g>
 | 
				
			||||||
 | 
							</g>
 | 
				
			||||||
 | 
							<g>
 | 
				
			||||||
 | 
								<g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st3" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
				
			||||||
 | 
											c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
				
			||||||
 | 
											c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
				
			||||||
 | 
											/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
								</g>
 | 
				
			||||||
 | 
							</g>
 | 
				
			||||||
 | 
							<g>
 | 
				
			||||||
 | 
								<g>
 | 
				
			||||||
 | 
									<g>
 | 
				
			||||||
 | 
										<path class="st4" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
 | 
				
			||||||
 | 
											c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
 | 
				
			||||||
 | 
											c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
				
			||||||
 | 
									</g>
 | 
				
			||||||
 | 
								</g>
 | 
				
			||||||
 | 
							</g>
 | 
				
			||||||
 | 
						</g>
 | 
				
			||||||
 | 
						<g>
 | 
				
			||||||
 | 
							<path class="st1" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
 | 
				
			||||||
 | 
								c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
				
			||||||
 | 
								c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
				
			||||||
 | 
								c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
				
			||||||
 | 
								c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
				
			||||||
 | 
								c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
				
			||||||
 | 
								C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
				
			||||||
 | 
								s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
				
			||||||
 | 
								c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
				
			||||||
 | 
								s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
				
			||||||
 | 
								C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
				
			||||||
 | 
								c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
 | 
				
			||||||
 | 
								c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
				
			||||||
 | 
								c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
				
			||||||
 | 
								v10.8h-3.1V133z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
				
			||||||
 | 
							<path class="st1" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
				
			||||||
 | 
								c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
				
			||||||
 | 
								v10.8h-3.1V133z"/>
 | 
				
			||||||
 | 
						</g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					<g>
 | 
				
			||||||
 | 
					</g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 8.0 KiB  | 
@@ -251,6 +251,17 @@ components:
 | 
				
			|||||||
        latestFirmwareAvailable:
 | 
					        latestFirmwareAvailable:
 | 
				
			||||||
          type: boolean
 | 
					          type: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ExtraSystemConfiguration:
 | 
				
			||||||
 | 
					      type: array
 | 
				
			||||||
 | 
					      items:
 | 
				
			||||||
 | 
					        type: object
 | 
				
			||||||
 | 
					        properties:
 | 
				
			||||||
 | 
					          parameterName:
 | 
				
			||||||
 | 
					            type: string
 | 
				
			||||||
 | 
					          parameterValue:
 | 
				
			||||||
 | 
					            type: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #########################################################################################
 | 
					    #########################################################################################
 | 
				
			||||||
    ##
 | 
					    ##
 | 
				
			||||||
    ## These are endpoints that all services in the uCentral stack must provide
 | 
					    ## These are endpoints that all services in the uCentral stack must provide
 | 
				
			||||||
@@ -342,6 +353,33 @@ components:
 | 
				
			|||||||
                type: integer
 | 
					                type: integer
 | 
				
			||||||
                format: int64
 | 
					                format: int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SystemResources:
 | 
				
			||||||
 | 
					      type: object
 | 
				
			||||||
 | 
					      properties:
 | 
				
			||||||
 | 
					        numberOfFileDescriptors:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					        currRealMem:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					        peakRealMem:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					        currVirtMem:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					        peakVirtMem:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SystemCommandResults:
 | 
				
			||||||
 | 
					      type: object
 | 
				
			||||||
 | 
					      oneOf:
 | 
				
			||||||
 | 
					        - $ref: '#/components/schemas/SystemResources'
 | 
				
			||||||
 | 
					        - $ref: '#/components/schemas/SystemInfoResults'
 | 
				
			||||||
 | 
					        - $ref: '#/components/schemas/StringList'
 | 
				
			||||||
 | 
					        - $ref: '#/components/schemas/TagValuePairList'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SystemCommandSetLogLevel:
 | 
					    SystemCommandSetLogLevel:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
      properties:
 | 
					      properties:
 | 
				
			||||||
@@ -476,6 +514,11 @@ paths:
 | 
				
			|||||||
            type: boolean
 | 
					            type: boolean
 | 
				
			||||||
            default: false
 | 
					            default: false
 | 
				
			||||||
          required: false
 | 
					          required: false
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          name: updateTimeOnly
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: boolean
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
      responses:
 | 
					      responses:
 | 
				
			||||||
        200:
 | 
					        200:
 | 
				
			||||||
          description: List firmwares
 | 
					          description: List firmwares
 | 
				
			||||||
@@ -483,6 +526,11 @@ paths:
 | 
				
			|||||||
            application/json:
 | 
					            application/json:
 | 
				
			||||||
              schema:
 | 
					              schema:
 | 
				
			||||||
                oneOf:
 | 
					                oneOf:
 | 
				
			||||||
 | 
					                  - type: object
 | 
				
			||||||
 | 
					                    properties:
 | 
				
			||||||
 | 
					                      lastUpdateTime:
 | 
				
			||||||
 | 
					                        type: integer
 | 
				
			||||||
 | 
					                        format: int64
 | 
				
			||||||
                  - $ref: '#/components/schemas/FirmwareDetailsList'
 | 
					                  - $ref: '#/components/schemas/FirmwareDetailsList'
 | 
				
			||||||
                  - $ref: '#/components/schemas/FirmwareDetails'
 | 
					                  - $ref: '#/components/schemas/FirmwareDetails'
 | 
				
			||||||
        403:
 | 
					        403:
 | 
				
			||||||
@@ -490,6 +538,29 @@ paths:
 | 
				
			|||||||
        404:
 | 
					        404:
 | 
				
			||||||
          $ref: '#/components/responses/NotFound'
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    put:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - Firmware
 | 
				
			||||||
 | 
					      summary: Force a DB refresh.
 | 
				
			||||||
 | 
					      description: Force a DB refresh.
 | 
				
			||||||
 | 
					      operationId: updateFirmwareList
 | 
				
			||||||
 | 
					      parameters:
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          description: Force the firmware DB update
 | 
				
			||||||
 | 
					          name: update
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: boolean
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Success'
 | 
				
			||||||
 | 
					        400:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/BadRequest'
 | 
				
			||||||
 | 
					        403:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /firmware/{id}:
 | 
					  /firmware/{id}:
 | 
				
			||||||
    get:
 | 
					    get:
 | 
				
			||||||
      tags:
 | 
					      tags:
 | 
				
			||||||
@@ -699,19 +770,19 @@ paths:
 | 
				
			|||||||
      operationId: getFirmwareAge
 | 
					      operationId: getFirmwareAge
 | 
				
			||||||
      parameters:
 | 
					      parameters:
 | 
				
			||||||
        - in: query
 | 
					        - in: query
 | 
				
			||||||
          description: The exact current verion of the firmware on that device.
 | 
					          description: The exact current version of the firmware on that device.
 | 
				
			||||||
          name: revision
 | 
					          name: revision
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
        - in: query
 | 
					        - in: query
 | 
				
			||||||
          description: The exact current verion of the firmware on that device.
 | 
					          description: The exact current version of the firmware on that device.
 | 
				
			||||||
          name: deviceType
 | 
					          name: deviceType
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
        - in: query
 | 
					        - in: query
 | 
				
			||||||
          description: Specify lits of serial  numbers to retrive age for
 | 
					          description: Specify list of serial  numbers to retrieve age for
 | 
				
			||||||
          name: select
 | 
					          name: select
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
@@ -881,16 +952,75 @@ paths:
 | 
				
			|||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
            enum:
 | 
					            enum:
 | 
				
			||||||
              - info
 | 
					              - info
 | 
				
			||||||
 | 
					              - extraConfiguration
 | 
				
			||||||
 | 
					              - resources
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
 | 
					 | 
				
			||||||
      responses:
 | 
					      responses:
 | 
				
			||||||
        200:
 | 
					        200:
 | 
				
			||||||
          description: Successfull command execution
 | 
					          $ref: '#/components/schemas/SystemCommandResults'
 | 
				
			||||||
          content:
 | 
					        403:
 | 
				
			||||||
            application/json:
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
              schema:
 | 
					        404:
 | 
				
			||||||
                oneOf:
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
                  - $ref: '#/components/schemas/SystemInfoResults'
 | 
					
 | 
				
			||||||
 | 
					  /systemConfiguration:
 | 
				
			||||||
 | 
					    get:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - SystemConfiguration
 | 
				
			||||||
 | 
					      summary: Retrieve system configuration items
 | 
				
			||||||
 | 
					      operationId: getSystemConfiguration
 | 
				
			||||||
 | 
					      parameters:
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          description: Which parameters you want to retrieve
 | 
				
			||||||
 | 
					          name: entries
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: string
 | 
				
			||||||
 | 
					            example:
 | 
				
			||||||
 | 
					              - element1
 | 
				
			||||||
 | 
					              - element1,element2,element3
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          description: List of configuration elements
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                type: array
 | 
				
			||||||
 | 
					                items:
 | 
				
			||||||
 | 
					                  $ref: '#/components/schemas/ExtraSystemConfiguration'
 | 
				
			||||||
 | 
					        403:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    put:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - SystemConfiguration
 | 
				
			||||||
 | 
					      summary: Set some or all system configuration
 | 
				
			||||||
 | 
					      operationId: setSystemConfiguration
 | 
				
			||||||
 | 
					      requestBody:
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              $ref: '#/components/schemas/ExtraSystemConfiguration'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          $ref: '#/components/schemas/ExtraSystemConfiguration'
 | 
				
			||||||
 | 
					        403:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    delete:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - SystemConfiguration
 | 
				
			||||||
 | 
					      summary: Delete all additional system configuration
 | 
				
			||||||
 | 
					      operationId: deleteSystemConfiguration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Success'
 | 
				
			||||||
        403:
 | 
					        403:
 | 
				
			||||||
          $ref: '#/components/responses/Unauthorized'
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
        404:
 | 
					        404:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								overlays/curl/portfile.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
 | 
				
			||||||
							
								
								
									
										4
									
								
								overlays/curl/vcpkg.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "curl",
 | 
				
			||||||
 | 
					    "version-string": "7.74.0-1.3+deb11u3"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								overlays/openssl/portfile.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
 | 
				
			||||||
							
								
								
									
										4
									
								
								overlays/openssl/vcpkg.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "openssl",
 | 
				
			||||||
 | 
					    "version-string": "1.1.1n-0+deb11u3"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								overlays/zlib/portfile.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
 | 
				
			||||||
							
								
								
									
										4
									
								
								overlays/zlib/vcpkg.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "zlib",
 | 
				
			||||||
 | 
					    "version-string": "1:1.2.11.dfsg-2+deb11u2"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -43,6 +43,8 @@ firmwaredb.maxage = 90
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Firmware Microservice Specific Section
 | 
					# Firmware Microservice Specific Section
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					s3.useVirtualAdressing = true
 | 
				
			||||||
 | 
					s3.endpoint.https = true
 | 
				
			||||||
s3.bucketname = ucentral-ap-firmware
 | 
					s3.bucketname = ucentral-ap-firmware
 | 
				
			||||||
s3.region = us-east-1
 | 
					s3.region = us-east-1
 | 
				
			||||||
s3.secret = *******************************************
 | 
					s3.secret = *******************************************
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,12 +38,15 @@ openwifi.system.commandchannel = /tmp/app.ucentralfms
 | 
				
			|||||||
openwifi.system.uri.ui = ${SYSTEM_URI_UI}
 | 
					openwifi.system.uri.ui = ${SYSTEM_URI_UI}
 | 
				
			||||||
openwifi.security.restapi.disable = ${SECURITY_RESTAPI_DISABLE}
 | 
					openwifi.security.restapi.disable = ${SECURITY_RESTAPI_DISABLE}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
firmwaredb.refresh = 1800
 | 
					firmwaredb.refresh = ${FIRMWAREDB_REFRESH}
 | 
				
			||||||
firmwaredb.maxage = 90
 | 
					firmwaredb.maxage = ${FIRMWAREDB_MAXAGE}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Firmware Microservice Specific Section
 | 
					# Firmware Microservice Specific Section
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					s3.useVirtualAdressing = ${S3_VIRTUAL_ADRESSING}
 | 
				
			||||||
 | 
					s3.endpointOverride = ${S3_ENDPOINT}
 | 
				
			||||||
 | 
					s3.endpoint.https = ${S3_HTTPS}
 | 
				
			||||||
s3.bucketname = ${S3_BUCKETNAME}
 | 
					s3.bucketname = ${S3_BUCKETNAME}
 | 
				
			||||||
s3.region = ${S3_REGION}
 | 
					s3.region = ${S3_REGION}
 | 
				
			||||||
s3.secret = ${S3_SECRET}
 | 
					s3.secret = ${S3_SECRET}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,20 +3,26 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "AutoUpdater.h"
 | 
					#include "AutoUpdater.h"
 | 
				
			||||||
#include "SDK/Prov_SDK.h"
 | 
					 | 
				
			||||||
#include "SDK/GW_SDK.h"
 | 
					 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
 | 
					#include "SDK/GW_SDK.h"
 | 
				
			||||||
 | 
					#include "SDK/Prov_SDK.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/MicroServiceFuncs.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fmt/format.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int AutoUpdater::Start() {
 | 
						int AutoUpdater::Start() {
 | 
				
			||||||
		poco_information(Logger(), "Starting...");
 | 
							poco_information(Logger(), "Starting...");
 | 
				
			||||||
        AutoUpdaterEnabled_ = MicroService::instance().ConfigGetBool("autoupdater.enabled", false);
 | 
							AutoUpdaterEnabled_ = MicroServiceConfigGetBool("autoupdater.enabled", false);
 | 
				
			||||||
		if (AutoUpdaterEnabled_) {
 | 
							if (AutoUpdaterEnabled_) {
 | 
				
			||||||
			Running_ = false;
 | 
								Running_ = false;
 | 
				
			||||||
            AutoUpdaterFrequency_ = MicroService::instance().ConfigGetInt("autoupdater.frequency",600);
 | 
								AutoUpdaterFrequency_ = MicroServiceConfigGetInt("autoupdater.frequency", 600);
 | 
				
			||||||
            AutoUpdaterCallBack_ = std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer);
 | 
								AutoUpdaterCallBack_ =
 | 
				
			||||||
 | 
									std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer);
 | 
				
			||||||
			Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes
 | 
								Timer_.setStartInterval(5 * 60 * 1000); // first run in 5 minutes
 | 
				
			||||||
			Timer_.setPeriodicInterval(AutoUpdaterFrequency_ * 1000);
 | 
								Timer_.setPeriodicInterval(AutoUpdaterFrequency_ * 1000);
 | 
				
			||||||
			Timer_.start(*AutoUpdaterCallBack_);
 | 
								Timer_.start(*AutoUpdaterCallBack_);
 | 
				
			||||||
@@ -50,29 +56,34 @@ namespace OpenWifi {
 | 
				
			|||||||
			try {
 | 
								try {
 | 
				
			||||||
				poco_debug(Logger(), fmt::format("Preparing to upgrade {}", Entry.first));
 | 
									poco_debug(Logger(), fmt::format("Preparing to upgrade {}", Entry.first));
 | 
				
			||||||
				auto CacheEntry = Cache_.find(Entry.first);
 | 
									auto CacheEntry = Cache_.find(Entry.first);
 | 
				
			||||||
                uint64_t now = OpenWifi::Now();
 | 
									uint64_t now = Utils::Now();
 | 
				
			||||||
				std::string firmwareUpgrade;
 | 
									std::string firmwareUpgrade;
 | 
				
			||||||
				if (CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck - now) > 300) {
 | 
									if (CacheEntry == Cache_.end() || (CacheEntry->second.LastCheck - now) > 300) {
 | 
				
			||||||
					//  get the firmware settings for that device.
 | 
										//  get the firmware settings for that device.
 | 
				
			||||||
					SerialCache C;
 | 
										SerialCache C;
 | 
				
			||||||
					C.LastCheck = now;
 | 
										C.LastCheck = now;
 | 
				
			||||||
					bool firmwareRCOnly;
 | 
										bool firmwareRCOnly;
 | 
				
			||||||
                    if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) {
 | 
										if (OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade,
 | 
				
			||||||
                        poco_debug(Logger(),fmt::format("Found firmware options for {}",Entry.first));
 | 
																					firmwareRCOnly)) {
 | 
				
			||||||
 | 
											poco_debug(Logger(),
 | 
				
			||||||
 | 
													   fmt::format("Found firmware options for {}", Entry.first));
 | 
				
			||||||
						C.firmwareRCOnly = firmwareRCOnly;
 | 
											C.firmwareRCOnly = firmwareRCOnly;
 | 
				
			||||||
						C.firmwareUpgrade = firmwareUpgrade;
 | 
											C.firmwareUpgrade = firmwareUpgrade;
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
                        poco_debug(Logger(),fmt::format("Found no firmware options for {}",Entry.first));
 | 
											poco_debug(Logger(),
 | 
				
			||||||
 | 
													   fmt::format("Found no firmware options for {}", Entry.first));
 | 
				
			||||||
						C.firmwareRCOnly = firmwareRCOnly;
 | 
											C.firmwareRCOnly = firmwareRCOnly;
 | 
				
			||||||
						C.firmwareUpgrade = firmwareUpgrade;
 | 
											C.firmwareUpgrade = firmwareUpgrade;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					Cache_[Entry.first] = C;
 | 
										Cache_[Entry.first] = C;
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (firmwareUpgrade == "no") {
 | 
									if (firmwareUpgrade == "no") {
 | 
				
			||||||
                    poco_information(Logger(),fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first));
 | 
										poco_information(
 | 
				
			||||||
 | 
											Logger(),
 | 
				
			||||||
 | 
											fmt::format("Device {} not upgradable. Provisioning service settings.",
 | 
				
			||||||
 | 
														Entry.first));
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,20 +93,31 @@ namespace OpenWifi {
 | 
				
			|||||||
				if (LF) {
 | 
									if (LF) {
 | 
				
			||||||
					if (StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id, fwDetails)) {
 | 
										if (StorageService()->FirmwaresDB().GetFirmware(fwEntry.Id, fwDetails)) {
 | 
				
			||||||
						//  send the command to upgrade this device...
 | 
											//  send the command to upgrade this device...
 | 
				
			||||||
                        poco_information(Logger(),fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision));
 | 
											poco_information(Logger(), fmt::format("Upgrading {} to version {}",
 | 
				
			||||||
                        if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) {
 | 
																				   Entry.first, fwEntry.Revision));
 | 
				
			||||||
                            poco_information(Logger(),fmt::format("Upgrade command sent for {}",Entry.first));
 | 
											if (OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,
 | 
				
			||||||
 | 
																							  fwDetails.uri)) {
 | 
				
			||||||
 | 
												poco_information(
 | 
				
			||||||
 | 
													Logger(), fmt::format("Upgrade command sent for {}", Entry.first));
 | 
				
			||||||
						} else {
 | 
											} else {
 | 
				
			||||||
                            poco_information(Logger(),fmt::format("Upgrade command not sent for {}",Entry.first));
 | 
												poco_information(
 | 
				
			||||||
 | 
													Logger(),
 | 
				
			||||||
 | 
													fmt::format("Upgrade command not sent for {}", Entry.first));
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
                        poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
 | 
											poco_information(Logger(),
 | 
				
			||||||
 | 
															 fmt::format("Firmware for device {} ({}) cannot be found.",
 | 
				
			||||||
 | 
																		 Entry.first, Entry.second));
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
                    poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second ));
 | 
										poco_information(Logger(),
 | 
				
			||||||
 | 
														 fmt::format("Firmware for device {} ({}) cannot be found.",
 | 
				
			||||||
 | 
																	 Entry.first, Entry.second));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} catch (...) {
 | 
								} catch (...) {
 | 
				
			||||||
                poco_information(Logger(),fmt::format("Exception during auto update for device {}.", Entry.first ));
 | 
									poco_information(
 | 
				
			||||||
 | 
										Logger(),
 | 
				
			||||||
 | 
										fmt::format("Exception during auto update for device {}.", Entry.first));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -104,4 +126,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		poco_information(Logger(), "Reinitializing.");
 | 
							poco_information(Logger(), "Reinitializing.");
 | 
				
			||||||
		Reset();
 | 
							Reset();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -2,19 +2,18 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-10-04.
 | 
					// Created by stephane bourque on 2021-10-04.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OWFMS_AUTOUPDATER_H
 | 
					#pragma once
 | 
				
			||||||
#define OWFMS_AUTOUPDATER_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
#include <deque>
 | 
					#include <deque>
 | 
				
			||||||
#include "Poco/Util/Application.h"
 | 
					
 | 
				
			||||||
#include "Poco/Timer.h"
 | 
					#include "Poco/Timer.h"
 | 
				
			||||||
 | 
					#include "Poco/Util/Application.h"
 | 
				
			||||||
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class AutoUpdater : public SubSystemServer { // };, Poco::Runnable {
 | 
						class AutoUpdater : public SubSystemServer { // };, Poco::Runnable {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
 | 
					 | 
				
			||||||
		struct SerialCache {
 | 
							struct SerialCache {
 | 
				
			||||||
			uint64_t LastCheck = 0;
 | 
								uint64_t LastCheck = 0;
 | 
				
			||||||
			std::string firmwareUpgrade;
 | 
								std::string firmwareUpgrade;
 | 
				
			||||||
@@ -46,13 +45,9 @@ namespace OpenWifi {
 | 
				
			|||||||
		Poco::Timer Timer_;
 | 
							Poco::Timer Timer_;
 | 
				
			||||||
		std::unique_ptr<Poco::TimerCallback<AutoUpdater>> AutoUpdaterCallBack_;
 | 
							std::unique_ptr<Poco::TimerCallback<AutoUpdater>> AutoUpdaterCallBack_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        explicit AutoUpdater() noexcept:
 | 
							explicit AutoUpdater() noexcept
 | 
				
			||||||
        SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater")
 | 
								: SubSystemServer("AutoUpdater", "AUTO-UPDATER", "autoupdater") {}
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline auto AutoUpdater() { return AutoUpdater::instance(); }
 | 
						inline auto AutoUpdater() { return AutoUpdater::instance(); }
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //OWFMS_AUTOUPDATER_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,50 +3,47 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <aws/core/Aws.h>
 | 
					#include <aws/core/Aws.h>
 | 
				
			||||||
#include <aws/s3/model/CreateBucketRequest.h>
 | 
					 | 
				
			||||||
#include <aws/s3/model/PutObjectRequest.h>
 | 
					 | 
				
			||||||
#include <aws/s3/model/AccessControlPolicy.h>
 | 
					#include <aws/s3/model/AccessControlPolicy.h>
 | 
				
			||||||
#include <aws/s3/model/PutBucketAclRequest.h>
 | 
					#include <aws/s3/model/CreateBucketRequest.h>
 | 
				
			||||||
#include <aws/s3/model/GetBucketAclRequest.h>
 | 
					#include <aws/s3/model/GetBucketAclRequest.h>
 | 
				
			||||||
 | 
					#include <aws/s3/model/PutBucketAclRequest.h>
 | 
				
			||||||
 | 
					#include <aws/s3/model/PutObjectRequest.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "AutoUpdater.h"
 | 
				
			||||||
#include "Daemon.h"
 | 
					#include "Daemon.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					 | 
				
			||||||
#include "ManifestCreator.h"
 | 
					 | 
				
			||||||
#include "NewConnectionHandler.h"
 | 
					 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					 | 
				
			||||||
#include "DeviceCache.h"
 | 
					#include "DeviceCache.h"
 | 
				
			||||||
#include "FirmwareCache.h"
 | 
					#include "FirmwareCache.h"
 | 
				
			||||||
#include "AutoUpdater.h"
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
 | 
					#include "ManifestCreator.h"
 | 
				
			||||||
#include "NewCommandHandler.h"
 | 
					#include "NewCommandHandler.h"
 | 
				
			||||||
 | 
					#include "NewConnectionHandler.h"
 | 
				
			||||||
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/UI_WebSocketClientServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class Daemon *Daemon::instance_ = nullptr;
 | 
						class Daemon *Daemon::instance_ = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class Daemon *Daemon::instance() {
 | 
						class Daemon *Daemon::instance() {
 | 
				
			||||||
		if (instance_ == nullptr) {
 | 
							if (instance_ == nullptr) {
 | 
				
			||||||
            instance_ = new Daemon(vDAEMON_PROPERTIES_FILENAME,
 | 
								instance_ = new Daemon(
 | 
				
			||||||
                                   vDAEMON_ROOT_ENV_VAR,
 | 
									vDAEMON_PROPERTIES_FILENAME, vDAEMON_ROOT_ENV_VAR, vDAEMON_CONFIG_ENV_VAR,
 | 
				
			||||||
                                   vDAEMON_CONFIG_ENV_VAR,
 | 
									vDAEMON_APP_NAME, vDAEMON_BUS_TIMER,
 | 
				
			||||||
                                   vDAEMON_APP_NAME,
 | 
									SubSystemVec{StorageService(), FirmwareCache(), LatestFirmwareCache(),
 | 
				
			||||||
                                   vDAEMON_BUS_TIMER,
 | 
												 DeviceCache(), NewConnectionHandler(), ManifestCreator(),
 | 
				
			||||||
                                   SubSystemVec{
 | 
												 AutoUpdater(), NewCommandHandler(), UI_WebSocketClientServer()});
 | 
				
			||||||
                                            StorageService(),
 | 
					 | 
				
			||||||
                                            FirmwareCache(),
 | 
					 | 
				
			||||||
                                            LatestFirmwareCache(),
 | 
					 | 
				
			||||||
                                            DeviceCache(),
 | 
					 | 
				
			||||||
                                            NewConnectionHandler(),
 | 
					 | 
				
			||||||
                                            ManifestCreator(),
 | 
					 | 
				
			||||||
                                            AutoUpdater(),
 | 
					 | 
				
			||||||
                                            NewCommandHandler()
 | 
					 | 
				
			||||||
                                   });
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return instance_;
 | 
							return instance_;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {
 | 
						void Daemon::PostInitialization([[maybe_unused]] Poco::Util::Application &self) {}
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
 | 
						void DaemonPostInitialization(Poco::Util::Application &self) {
 | 
				
			||||||
 | 
							Daemon()->PostInitialization(self);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv) {
 | 
				
			||||||
	SSL_library_init();
 | 
						SSL_library_init();
 | 
				
			||||||
	Aws::SDKOptions AwsOptions;
 | 
						Aws::SDKOptions AwsOptions;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								src/Daemon.h
									
									
									
									
									
								
							
							
						
						@@ -6,9 +6,11 @@
 | 
				
			|||||||
#define UCENTRALFWS_DAEMON_H
 | 
					#define UCENTRALFWS_DAEMON_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
 | 
					#include "framework/MicroServiceNames.h"
 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
					
 | 
				
			||||||
#include "Dashboard.h"
 | 
					#include "Dashboard.h"
 | 
				
			||||||
 | 
					#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,19 +22,14 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	class Daemon : public MicroService {
 | 
						class Daemon : public MicroService {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        explicit Daemon(const std::string & PropFile,
 | 
							explicit Daemon(const std::string &PropFile, const std::string &RootEnv,
 | 
				
			||||||
                        const std::string & RootEnv,
 | 
											const std::string &ConfigEnv, const std::string &AppName, uint64_t BusTimer,
 | 
				
			||||||
                        const std::string & ConfigEnv,
 | 
											const SubSystemVec &SubSystems)
 | 
				
			||||||
                        const std::string & AppName,
 | 
								: MicroService(PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems){};
 | 
				
			||||||
                        uint64_t 	BusTimer,
 | 
					 | 
				
			||||||
                        const SubSystemVec & SubSystems) :
 | 
					 | 
				
			||||||
                MicroService( PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems) {};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void PostInitialization(Poco::Util::Application &self);
 | 
							void PostInitialization(Poco::Util::Application &self);
 | 
				
			||||||
		static Daemon *instance();
 | 
							static Daemon *instance();
 | 
				
			||||||
        inline void ResetDashboard() { DB_.Reset(); }
 | 
							inline DeviceDashboard &GetDashboard() { return DB_; }
 | 
				
			||||||
        inline void CreateDashboard() { DB_.Create(); }
 | 
					 | 
				
			||||||
        inline const FMSObjects::DeviceReport & GetDashboard() { return DB_.Report(); }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		static Daemon *instance_;
 | 
							static Daemon *instance_;
 | 
				
			||||||
@@ -40,9 +37,6 @@ namespace OpenWifi {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline Daemon *Daemon() { return Daemon::instance(); }
 | 
						inline Daemon *Daemon() { return Daemon::instance(); }
 | 
				
			||||||
    inline void DaemonPostInitialization(Poco::Util::Application &self) {
 | 
					} // namespace OpenWifi
 | 
				
			||||||
        Daemon()->PostInitialization(self);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFWS_DAEMON_H
 | 
					#endif // UCENTRALFWS_DAEMON_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,15 +4,47 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "Dashboard.h"
 | 
					#include "Dashboard.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	void DeviceDashboard::Create() {
 | 
					 | 
				
			||||||
		uint64_t Now = OpenWifi::Now();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(LastRun_==0 || (Now-LastRun_)>120) {
 | 
						bool DeviceDashboard::Get(FMSObjects::DeviceReport &D, Poco::Logger &Logger) {
 | 
				
			||||||
			DB_.reset();
 | 
							uint64_t Now = Utils::Now();
 | 
				
			||||||
			StorageService()->DevicesDB().GenerateDeviceReport(DB_);
 | 
							if (!ValidDashboard_ || LastRun_ == 0 || (Now - LastRun_) > 120) {
 | 
				
			||||||
			LastRun_ = Now;
 | 
								Generate(D, Logger);
 | 
				
			||||||
		}
 | 
							} else {
 | 
				
			||||||
 | 
								std::lock_guard G(DataMutex_);
 | 
				
			||||||
 | 
								D = DB_;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ValidDashboard_;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DeviceDashboard::Generate(FMSObjects::DeviceReport &D, Poco::Logger &Logger) {
 | 
				
			||||||
 | 
							if (GeneratingDashboard_.load()) {
 | 
				
			||||||
 | 
								// std::cout << "Trying to generate dashboard but already being generated" << std::endl;
 | 
				
			||||||
 | 
								while (GeneratingDashboard_.load()) {
 | 
				
			||||||
 | 
									Poco::Thread::trySleep(100);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								std::lock_guard G(DataMutex_);
 | 
				
			||||||
 | 
								D = DB_;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								GeneratingDashboard_ = true;
 | 
				
			||||||
 | 
								ValidDashboard_ = false;
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									// std::cout << "Generating dashboard." << std::endl;
 | 
				
			||||||
 | 
									poco_information(Logger, "DASHBOARD: Generating a new dashboard.");
 | 
				
			||||||
 | 
									FMSObjects::DeviceReport NewData;
 | 
				
			||||||
 | 
									StorageService()->DevicesDB().GenerateDeviceReport(NewData);
 | 
				
			||||||
 | 
									LastRun_ = Utils::Now();
 | 
				
			||||||
 | 
									NewData.snapshot = LastRun_;
 | 
				
			||||||
 | 
									D = NewData;
 | 
				
			||||||
 | 
									std::lock_guard G(DataMutex_);
 | 
				
			||||||
 | 
									DB_ = NewData;
 | 
				
			||||||
 | 
									ValidDashboard_ = true;
 | 
				
			||||||
 | 
								} catch (...) {
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								GeneratingDashboard_ = false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,22 +2,26 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-21.
 | 
					// Created by stephane bourque on 2021-07-21.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALGW_DASHBOARD_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALGW_DASHBOARD_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include <mutex>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Poco/Logger.h"
 | 
				
			||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
					#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
				
			||||||
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class DeviceDashboard {
 | 
						class DeviceDashboard {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
			void Create();
 | 
							bool Get(FMSObjects::DeviceReport &D, Poco::Logger &Logger);
 | 
				
			||||||
			const FMSObjects::DeviceReport & Report() const { return DB_;}
 | 
					
 | 
				
			||||||
			inline void Reset() { LastRun_=0; DB_.reset(); }
 | 
					 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
 | 
							std::mutex DataMutex_;
 | 
				
			||||||
 | 
							volatile std::atomic_bool GeneratingDashboard_ = false;
 | 
				
			||||||
 | 
							volatile bool ValidDashboard_ = false;
 | 
				
			||||||
		FMSObjects::DeviceReport DB_;
 | 
							FMSObjects::DeviceReport DB_;
 | 
				
			||||||
		uint64_t LastRun_ = 0;
 | 
							uint64_t LastRun_ = 0;
 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALGW_DASHBOARD_H
 | 
							void Generate(FMSObjects::DeviceReport &D, Poco::Logger &Logger);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,17 +16,14 @@ namespace OpenWifi {
 | 
				
			|||||||
		poco_information(Logger(), "Stopped...");
 | 
							poco_information(Logger(), "Stopped...");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void DeviceCache::AddToCache(
 | 
						void DeviceCache::AddToCache(const std::string &SerialNumber, const std::string &DeviceType,
 | 
				
			||||||
                        const std::string &SerialNumber, const std::string & DeviceType,
 | 
					 | 
				
			||||||
								 const std::string &Host, const std::string &Revision) {
 | 
													 const std::string &Host, const std::string &Revision) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		auto Device = DeviceCache_.find(SerialNumber);
 | 
							auto Device = DeviceCache_.find(SerialNumber);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (Device == DeviceCache_.end()) {
 | 
							if (Device == DeviceCache_.end()) {
 | 
				
			||||||
            DeviceCache_[SerialNumber]=DeviceCacheEntry{
 | 
								DeviceCache_[SerialNumber] =
 | 
				
			||||||
                                                .deviceType=DeviceType,
 | 
									DeviceCacheEntry{.deviceType = DeviceType, .host = Host, .revision = Revision};
 | 
				
			||||||
                                                .host=Host,
 | 
					 | 
				
			||||||
                                                .revision=Revision};
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			Device->second.revision = Revision;
 | 
								Device->second.revision = Revision;
 | 
				
			||||||
			Device->second.host = Host;
 | 
								Device->second.host = Host;
 | 
				
			||||||
@@ -43,8 +40,5 @@ namespace OpenWifi {
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DeviceCache::DumpCache() {}
 | 
				
			||||||
    void DeviceCache::DumpCache() {
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -2,11 +2,10 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-13.
 | 
					// Created by stephane bourque on 2021-07-13.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALFMS_DEVICECACHE_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALFMS_DEVICECACHE_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,15 +33,9 @@ namespace OpenWifi {
 | 
				
			|||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::atomic_bool Running_ = false;
 | 
							std::atomic_bool Running_ = false;
 | 
				
			||||||
		DeviceCacheMap DeviceCache_;
 | 
							DeviceCacheMap DeviceCache_;
 | 
				
			||||||
        explicit DeviceCache() noexcept:
 | 
							explicit DeviceCache() noexcept
 | 
				
			||||||
                SubSystemServer("DeviceCache", "DEVICE-CACHE", "devicecache")
 | 
								: SubSystemServer("DeviceCache", "DEVICE-CACHE", "devicecache") {}
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline auto DeviceCache() { return DeviceCache::instance(); }
 | 
						inline auto DeviceCache() { return DeviceCache::instance(); }
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //UCENTRALFMS_DEVICECACHE_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,12 +16,15 @@ namespace OpenWifi {
 | 
				
			|||||||
		poco_information(Logger(), "Stopped...");
 | 
							poco_information(Logger(), "Stopped...");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::shared_ptr<FMSObjects::Firmware> GetFirmware([[maybe_unused]] const std::string & DeviceType, [[maybe_unused]] const std::string & Revision) {
 | 
						std::shared_ptr<FMSObjects::Firmware>
 | 
				
			||||||
 | 
						GetFirmware([[maybe_unused]] const std::string &DeviceType,
 | 
				
			||||||
 | 
									[[maybe_unused]] const std::string &Revision) {
 | 
				
			||||||
		return nullptr;
 | 
							return nullptr;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::shared_ptr<FMSObjects::Firmware> AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) {
 | 
						std::shared_ptr<FMSObjects::Firmware>
 | 
				
			||||||
 | 
						AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) {
 | 
				
			||||||
		return nullptr;
 | 
							return nullptr;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,14 +2,13 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-26.
 | 
					// Created by stephane bourque on 2021-07-26.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALFMS_FIRMWARECACHE_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALFMS_FIRMWARECACHE_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
					#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,21 +24,17 @@ namespace OpenWifi {
 | 
				
			|||||||
		int Start() override;
 | 
							int Start() override;
 | 
				
			||||||
		void Stop() override;
 | 
							void Stop() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision);
 | 
							std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string &DeviceType,
 | 
				
			||||||
 | 
																			  const std::string &Revision);
 | 
				
			||||||
		std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
 | 
							std::shared_ptr<FMSObjects::Firmware> AddFirmware(const FMSObjects::Firmware &F);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::atomic_bool Running_ = false;
 | 
							std::atomic_bool Running_ = false;
 | 
				
			||||||
		FirmwareCacheMap Cache_;
 | 
							FirmwareCacheMap Cache_;
 | 
				
			||||||
        explicit FirmwareCache() noexcept:
 | 
							explicit FirmwareCache() noexcept
 | 
				
			||||||
                SubSystemServer("FirmwareCache", "FIRMWARE-CACHE", "firmwarecache")
 | 
								: SubSystemServer("FirmwareCache", "FIRMWARE-CACHE", "firmwarecache") {}
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline auto FirmwareCache() { return FirmwareCache::instance(); }
 | 
						inline auto FirmwareCache() { return FirmwareCache::instance(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //UCENTRALFMS_FIRMWARECACHE_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		poco_information(Logger(), "Stopped...");
 | 
							poco_information(Logger(), "Stopped...");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) {
 | 
						bool LatestFirmwareCache::AddToCache(const std::string &DeviceType, const std::string &Revision,
 | 
				
			||||||
 | 
															 const std::string &Id, uint64_t TimeStamp) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		RevisionSet_.insert(Revision);
 | 
							RevisionSet_.insert(Revision);
 | 
				
			||||||
@@ -26,10 +27,8 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		auto E = Cache_.find(DeviceType);
 | 
							auto E = Cache_.find(DeviceType);
 | 
				
			||||||
		if ((E == Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
 | 
							if ((E == Cache_.end()) || (TimeStamp >= E->second.TimeStamp)) {
 | 
				
			||||||
            Cache_[DeviceType] = LatestFirmwareCacheEntry{
 | 
								Cache_[DeviceType] =
 | 
				
			||||||
                .Id=Id,
 | 
									LatestFirmwareCacheEntry{.Id = Id, .TimeStamp = TimeStamp, .Revision = Revision};
 | 
				
			||||||
                .TimeStamp=TimeStamp,
 | 
					 | 
				
			||||||
                .Revision=Revision};
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!IsRC(Revision))
 | 
							if (!IsRC(Revision))
 | 
				
			||||||
@@ -37,15 +36,14 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		auto rcE = rcCache_.find(DeviceType);
 | 
							auto rcE = rcCache_.find(DeviceType);
 | 
				
			||||||
		if ((rcE == rcCache_.end()) || (TimeStamp >= rcE->second.TimeStamp)) {
 | 
							if ((rcE == rcCache_.end()) || (TimeStamp >= rcE->second.TimeStamp)) {
 | 
				
			||||||
            rcCache_[DeviceType] = LatestFirmwareCacheEntry{
 | 
								rcCache_[DeviceType] =
 | 
				
			||||||
                .Id=Id,
 | 
									LatestFirmwareCacheEntry{.Id = Id, .TimeStamp = TimeStamp, .Revision = Revision};
 | 
				
			||||||
                .TimeStamp=TimeStamp,
 | 
					 | 
				
			||||||
                .Revision=Revision};
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry )  {
 | 
						bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType,
 | 
				
			||||||
 | 
																	 LatestFirmwareCacheEntry &Entry) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto E = Cache_.find(DeviceType);
 | 
							auto E = Cache_.find(DeviceType);
 | 
				
			||||||
@@ -56,7 +54,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) {
 | 
						bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType,
 | 
				
			||||||
 | 
																		   LatestFirmwareCacheEntry &Entry) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto E = rcCache_.find(DeviceType);
 | 
							auto E = rcCache_.find(DeviceType);
 | 
				
			||||||
@@ -67,7 +66,6 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
 | 
						bool LatestFirmwareCache::IsLatest(const std::string &DeviceType, const std::string &Revision) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -78,7 +76,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision) {
 | 
						bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType,
 | 
				
			||||||
 | 
																 const std::string &Revision) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto E = rcCache_.find(DeviceType);
 | 
							auto E = rcCache_.find(DeviceType);
 | 
				
			||||||
@@ -88,13 +87,11 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	void LatestFirmwareCache::DumpCache() {
 | 
						void LatestFirmwareCache::DumpCache() {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto &[Id, E] : Cache_) {
 | 
							for (auto &[Id, E] : Cache_) {
 | 
				
			||||||
			std::cout << "Device: " << Id << "    ID:" << E.Id << std::endl;
 | 
								std::cout << "Device: " << Id << "    ID:" << E.Id << std::endl;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -2,16 +2,17 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-13.
 | 
					// Created by stephane bourque on 2021-07-13.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALFMS_LATESTFIRMWARECACHE_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALFMS_LATESTFIRMWARECACHE_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
 | 
					#include "Poco/JWT/Signer.h"
 | 
				
			||||||
#include "Poco/Net/HTTPServerRequest.h"
 | 
					#include "Poco/Net/HTTPServerRequest.h"
 | 
				
			||||||
#include "Poco/Net/HTTPServerResponse.h"
 | 
					#include "Poco/Net/HTTPServerResponse.h"
 | 
				
			||||||
#include "Poco/JWT/Signer.h"
 | 
					 | 
				
			||||||
#include "Poco/SHA2Engine.h"
 | 
					#include "Poco/SHA2Engine.h"
 | 
				
			||||||
 | 
					#include "Poco/StringTokenizer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTObjects/RESTAPI_SecurityObjects.h"
 | 
					#include "RESTObjects/RESTAPI_SecurityObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -32,22 +33,30 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		int Start() override;
 | 
							int Start() override;
 | 
				
			||||||
		void Stop() override;
 | 
							void Stop() override;
 | 
				
			||||||
        bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp);
 | 
							bool AddToCache(const std::string &DeviceType, const std::string &Revision,
 | 
				
			||||||
 | 
											const std::string &Id, uint64_t TimeStamp);
 | 
				
			||||||
		// void AddRevision(const std::string &Revision);
 | 
							// void AddRevision(const std::string &Revision);
 | 
				
			||||||
		bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry);
 | 
							bool FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry);
 | 
				
			||||||
        bool FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry );
 | 
							bool FindLatestRCOnlyFirmware(const std::string &DeviceType,
 | 
				
			||||||
 | 
														  LatestFirmwareCacheEntry &Entry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline static bool IsRC(const std::string &Revision) {
 | 
							inline static bool IsRC(const std::string &Revision) {
 | 
				
			||||||
			// OpenWrt 21.02-SNAPSHOT r16399+120-c67509efd7 / TIP-v2.5.0-36b5478
 | 
								// OpenWrt 21.02-SNAPSHOT r16399+120-c67509efd7 / TIP-v2.5.0-36b5478
 | 
				
			||||||
			auto Tokens = Poco::StringTokenizer(Revision, "/", Poco::StringTokenizer::TOK_TRIM);
 | 
								auto Tokens = Poco::StringTokenizer(Revision, "/", Poco::StringTokenizer::TOK_TRIM);
 | 
				
			||||||
			if (Tokens.count() != 2)
 | 
								if (Tokens.count() != 2)
 | 
				
			||||||
				return false;
 | 
									return false;
 | 
				
			||||||
            return (Tokens[1].substr(0,5) == "IP-v");
 | 
								return (Tokens[1].substr(0, 5) == "TIP-v");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void DumpCache();
 | 
							void DumpCache();
 | 
				
			||||||
        inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; };
 | 
							inline Types::StringSet GetRevisions() {
 | 
				
			||||||
        inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; };
 | 
								std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
								return RevisionSet_;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							inline Types::StringSet GetDevices() {
 | 
				
			||||||
 | 
								std::lock_guard G(Mutex_);
 | 
				
			||||||
 | 
								return DeviceSet_;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
		bool IsLatest(const std::string &DeviceType, const std::string &Revision);
 | 
							bool IsLatest(const std::string &DeviceType, const std::string &Revision);
 | 
				
			||||||
		bool IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision);
 | 
							bool IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,14 +65,10 @@ namespace OpenWifi {
 | 
				
			|||||||
		rcOnlyLatestFirmwareCacheMap rcCache_;
 | 
							rcOnlyLatestFirmwareCacheMap rcCache_;
 | 
				
			||||||
		Types::StringSet RevisionSet_;
 | 
							Types::StringSet RevisionSet_;
 | 
				
			||||||
		Types::StringSet DeviceSet_;
 | 
							Types::StringSet DeviceSet_;
 | 
				
			||||||
        explicit LatestFirmwareCache() noexcept:
 | 
							explicit LatestFirmwareCache() noexcept
 | 
				
			||||||
                SubSystemServer("LatestFirmwareCache", "LATEST-FIRMWARE-CACHE", "LatestFirmwareCache")
 | 
								: SubSystemServer("LatestFirmwareCache", "LATEST-FIRMWARE-CACHE",
 | 
				
			||||||
        {
 | 
												  "LatestFirmwareCache") {}
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
 | 
						inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); }
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //UCENTRALFMS_LATESTFIRMWARECACHE_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,42 +6,61 @@
 | 
				
			|||||||
#include "Poco/JSON/Parser.h"
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
#include "Poco/JSON/Stringifier.h"
 | 
					#include "Poco/JSON/Stringifier.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <aws/s3/model/GetObjectRequest.h>
 | 
				
			||||||
#include <aws/s3/model/ListObjectsRequest.h>
 | 
					#include <aws/s3/model/ListObjectsRequest.h>
 | 
				
			||||||
#include <aws/s3/model/ListObjectsV2Request.h>
 | 
					#include <aws/s3/model/ListObjectsV2Request.h>
 | 
				
			||||||
#include <aws/s3/model/GetObjectRequest.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
#include "ManifestCreator.h"
 | 
					#include "ManifestCreator.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					
 | 
				
			||||||
 | 
					#include "fmt/format.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ManifestCreator::onTimer([[maybe_unused]] Poco::Timer &timer) {
 | 
						void ManifestCreator::onTimer([[maybe_unused]] Poco::Timer &timer) {
 | 
				
			||||||
		Utils::SetThreadName("manifest");
 | 
							Utils::SetThreadName("manifest");
 | 
				
			||||||
 | 
							RunUpdateTask();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ManifestCreator::RunUpdateTask() {
 | 
				
			||||||
 | 
							if (!UpdateRunning_.test_and_set(std::memory_order_acquire)) {
 | 
				
			||||||
			poco_information(Logger(), "Performing DB refresh");
 | 
								poco_information(Logger(), "Performing DB refresh");
 | 
				
			||||||
 | 
								RunnerThread_.start(*this);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								poco_information(Logger(), "DB refresh already in progress");
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ManifestCreator::run() {
 | 
				
			||||||
		S3BucketContent BucketList;
 | 
							S3BucketContent BucketList;
 | 
				
			||||||
		StorageService()->FirmwaresDB().RemoveOldFirmware();
 | 
							StorageService()->FirmwaresDB().RemoveOldFirmware();
 | 
				
			||||||
		ReadBucket(BucketList);
 | 
							ReadBucket(BucketList);
 | 
				
			||||||
        poco_information(Logger(),fmt::format("Found {} firmware entries in S3 repository.", BucketList.size()));
 | 
							poco_information(Logger(), fmt::format("Found {} firmware entries in S3 repository.",
 | 
				
			||||||
 | 
																   BucketList.size()));
 | 
				
			||||||
		ComputeManifest(BucketList);
 | 
							ComputeManifest(BucketList);
 | 
				
			||||||
		AddManifestToDB(BucketList);
 | 
							AddManifestToDB(BucketList);
 | 
				
			||||||
 | 
							LastUpdate_ = Utils::Now();
 | 
				
			||||||
 | 
							UpdateRunning_.clear(std::memory_order_release);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
 | 
						bool ManifestCreator::ComputeManifest(S3BucketContent &BucketContent) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uint64_t Limit = OpenWifi::Now() - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=0;
 | 
							uint64_t Limit = Utils::Now() - MaxAge_, Rejected = 0, Accepted = 0, BadFormat = 0,
 | 
				
			||||||
 | 
									 MissingJson = 0;
 | 
				
			||||||
		for (auto &[Name, Entry] : BucketContent) {
 | 
							for (auto &[Name, Entry] : BucketContent) {
 | 
				
			||||||
			std::string C = Entry.S3ContentManifest;
 | 
								std::string C = Entry.S3ContentManifest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				Poco::JSON::Parser P;
 | 
									Poco::JSON::Parser P;
 | 
				
			||||||
                auto ParsedContent = P.parse(Entry.S3ContentManifest).extract<Poco::JSON::Object::Ptr>();
 | 
									auto ParsedContent =
 | 
				
			||||||
 | 
										P.parse(Entry.S3ContentManifest).extract<Poco::JSON::Object::Ptr>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if( ParsedContent->has("image") &&
 | 
									if (ParsedContent->has("image") && ParsedContent->has("compatible") &&
 | 
				
			||||||
                    ParsedContent->has("compatible") &&
 | 
										ParsedContent->has("revision") && ParsedContent->has("timestamp")) {
 | 
				
			||||||
                    ParsedContent->has("revision") &&
 | 
					 | 
				
			||||||
                    ParsedContent->has("timestamp"))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
					Entry.Timestamp = ParsedContent->get("timestamp");
 | 
										Entry.Timestamp = ParsedContent->get("timestamp");
 | 
				
			||||||
					if (Entry.Timestamp > Limit) {
 | 
										if (Entry.Timestamp > Limit) {
 | 
				
			||||||
						Entry.Compatible = ParsedContent->get("compatible").toString();
 | 
											Entry.Compatible = ParsedContent->get("compatible").toString();
 | 
				
			||||||
@@ -49,7 +68,11 @@ namespace OpenWifi {
 | 
				
			|||||||
						Entry.Image = ParsedContent->get("image").toString();
 | 
											Entry.Image = ParsedContent->get("image").toString();
 | 
				
			||||||
						auto FullNme = Name + "-upgrade.bin";
 | 
											auto FullNme = Name + "-upgrade.bin";
 | 
				
			||||||
						if (FullNme != Entry.Image) {
 | 
											if (FullNme != Entry.Image) {
 | 
				
			||||||
                            poco_error(Logger(),fmt::format("MANIFEST({}): Image name does not match manifest name ({}).",Name,Entry.Image));
 | 
												poco_error(
 | 
				
			||||||
 | 
													Logger(),
 | 
				
			||||||
 | 
													fmt::format(
 | 
				
			||||||
 | 
														"MANIFEST({}): Image name does not match manifest name ({}).",
 | 
				
			||||||
 | 
														Name, Entry.Image));
 | 
				
			||||||
							Entry.Valid = false;
 | 
												Entry.Valid = false;
 | 
				
			||||||
							BadFormat++;
 | 
												BadFormat++;
 | 
				
			||||||
							continue;
 | 
												continue;
 | 
				
			||||||
@@ -61,7 +84,10 @@ namespace OpenWifi {
 | 
				
			|||||||
						Entry.Valid = false;
 | 
											Entry.Valid = false;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
                    poco_error(Logger(),fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",Name));
 | 
										poco_error(
 | 
				
			||||||
 | 
											Logger(),
 | 
				
			||||||
 | 
											fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",
 | 
				
			||||||
 | 
														Name));
 | 
				
			||||||
					MissingJson++;
 | 
										MissingJson++;
 | 
				
			||||||
					Entry.Valid = false;
 | 
										Entry.Valid = false;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -80,26 +106,39 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	bool ManifestCreator::AddManifestToDB(S3BucketContent &BucketContent) {
 | 
						bool ManifestCreator::AddManifestToDB(S3BucketContent &BucketContent) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//  remove all staging names
 | 
				
			||||||
 | 
							for (auto it = BucketContent.begin(); it != end(BucketContent);) {
 | 
				
			||||||
 | 
								if (it->second.URI.find("-staging-") != std::string::npos) {
 | 
				
			||||||
 | 
									it = BucketContent.erase(it);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									++it;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//  Now remove all DB entries that do not appear in the Latest manifest
 | 
				
			||||||
 | 
							auto RemovedEntries =
 | 
				
			||||||
 | 
								StorageService()->FirmwaresDB().RemoveOldDBEntriesNotInManifest(BucketContent);
 | 
				
			||||||
 | 
							poco_information(Logger(), fmt::format("Removed {} DB entries that no longer are relevant.",
 | 
				
			||||||
 | 
																   RemovedEntries));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto &[Release, BucketEntry] : BucketContent) {
 | 
							for (auto &[Release, BucketEntry] : BucketContent) {
 | 
				
			||||||
			FMSObjects::Firmware F;
 | 
								FMSObjects::Firmware F;
 | 
				
			||||||
			auto R = Release;
 | 
								auto R = Release;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // skip staging releases.
 | 
								if (BucketEntry.Valid &&
 | 
				
			||||||
            if(BucketEntry.URI.find("-staging-")!=std::string::npos)
 | 
									!StorageService()->FirmwaresDB().GetFirmwareByName(R, BucketEntry.Compatible, F)) {
 | 
				
			||||||
                continue;
 | 
									F.id = MicroServiceCreateUUID();
 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(BucketEntry.Valid && !StorageService()->FirmwaresDB().GetFirmwareByName(R,BucketEntry.Compatible,F)) {
 | 
					 | 
				
			||||||
                F.id = MicroService::instance().CreateUUID();
 | 
					 | 
				
			||||||
				F.release = Release;
 | 
									F.release = Release;
 | 
				
			||||||
				F.size = BucketEntry.S3Size;
 | 
									F.size = BucketEntry.S3Size;
 | 
				
			||||||
                F.created = OpenWifi::Now();
 | 
									F.created = Utils::Now();
 | 
				
			||||||
				F.imageDate = BucketEntry.S3TimeStamp;
 | 
									F.imageDate = BucketEntry.S3TimeStamp;
 | 
				
			||||||
				F.image = BucketEntry.Image;
 | 
									F.image = BucketEntry.Image;
 | 
				
			||||||
				F.uri = BucketEntry.URI;
 | 
									F.uri = BucketEntry.URI;
 | 
				
			||||||
				F.revision = BucketEntry.Revision;
 | 
									F.revision = BucketEntry.Revision;
 | 
				
			||||||
				F.deviceType = BucketEntry.Compatible;
 | 
									F.deviceType = BucketEntry.Compatible;
 | 
				
			||||||
				if (StorageService()->FirmwaresDB().AddFirmware(F)) {
 | 
									if (StorageService()->FirmwaresDB().AddFirmware(F)) {
 | 
				
			||||||
                    poco_information(Logger(),fmt::format("Adding firmware '{}', size={}",Release,F.size));
 | 
										poco_information(Logger(),
 | 
				
			||||||
 | 
														 fmt::format("Adding firmware '{}', size={}", Release, F.size));
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -109,25 +148,35 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	int ManifestCreator::Start() {
 | 
						int ManifestCreator::Start() {
 | 
				
			||||||
		Running_ = true;
 | 
							Running_ = true;
 | 
				
			||||||
        S3BucketName_ = MicroService::instance().ConfigGetString("s3.bucketname");
 | 
							S3EndpointOverride_ = MicroServiceConfigGetString("s3.endpointOverride", "");
 | 
				
			||||||
        S3Region_ = MicroService::instance().ConfigGetString("s3.region");
 | 
							S3EndpointHttps_ = MicroServiceConfigGetBool("s3.endpoint.https", true);
 | 
				
			||||||
        S3Secret_ = MicroService::instance().ConfigGetString("s3.secret");
 | 
							S3UseVirtualAdressing_  = MicroServiceConfigGetBool("s3.useVirtualAdressing", true);
 | 
				
			||||||
        S3Key_ = MicroService::instance().ConfigGetString("s3.key");
 | 
							S3BucketName_ = MicroServiceConfigGetString("s3.bucketname", "");
 | 
				
			||||||
        S3Retry_ = MicroService::instance().ConfigGetInt("s3.retry",60);
 | 
							S3Region_ = MicroServiceConfigGetString("s3.region", "");
 | 
				
			||||||
 | 
							S3Secret_ = MicroServiceConfigGetString("s3.secret", "");
 | 
				
			||||||
 | 
							S3Key_ = MicroServiceConfigGetString("s3.key", "");
 | 
				
			||||||
 | 
							S3Retry_ = MicroServiceConfigGetInt("s3.retry", 60);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        DBRefresh_ = MicroService::instance().ConfigGetInt("firmwaredb.refresh",30*60);
 | 
							DBRefresh_ = MicroServiceConfigGetInt("firmwaredb.refresh", 24 * 60 * 60);
 | 
				
			||||||
        MaxAge_ = MicroService::instance().ConfigGetInt("firmwaredb.maxage",90) * 24 * 60 * 60;
 | 
							MaxAge_ = MicroServiceConfigGetInt("firmwaredb.maxage", 90) * 24 * 60 * 60;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		AwsConfig_.enableTcpKeepAlive = true;
 | 
							AwsConfig_.enableTcpKeepAlive = true;
 | 
				
			||||||
		AwsConfig_.enableEndpointDiscovery = true;
 | 
							AwsConfig_.enableEndpointDiscovery = true;
 | 
				
			||||||
		AwsConfig_.useDualStack = true;
 | 
							AwsConfig_.useDualStack = true;
 | 
				
			||||||
 | 
							if(!S3EndpointHttps_)
 | 
				
			||||||
 | 
								AwsConfig_.scheme = Aws::Http::Scheme::HTTP;
 | 
				
			||||||
 | 
							if(!S3EndpointOverride_.empty()) {
 | 
				
			||||||
 | 
								AwsConfig_.endpointOverride = Aws::String(S3EndpointOverride_);
 | 
				
			||||||
 | 
								AwsConfig_.useDualStack = false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (!S3Region_.empty())
 | 
							if (!S3Region_.empty())
 | 
				
			||||||
			AwsConfig_.region = S3Region_;
 | 
								AwsConfig_.region = S3Region_;
 | 
				
			||||||
		AwsCreds_.SetAWSAccessKeyId(S3Key_);
 | 
							AwsCreds_.SetAWSAccessKeyId(S3Key_);
 | 
				
			||||||
		AwsCreds_.SetAWSSecretKey(S3Secret_);
 | 
							AwsCreds_.SetAWSSecretKey(S3Secret_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer);
 | 
							ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(
 | 
				
			||||||
        Timer_.setStartInterval(1 * 60 * 1000);  // first run in 1 minutes
 | 
								*this, &ManifestCreator::onTimer);
 | 
				
			||||||
 | 
							Timer_.setStartInterval(1 * 60 * 1000); // first run in 1 hour
 | 
				
			||||||
		Timer_.setPeriodicInterval((long)(DBRefresh_ * 1000));
 | 
							Timer_.setPeriodicInterval((long)(DBRefresh_ * 1000));
 | 
				
			||||||
		Timer_.start(*ManifestCreatorCallBack_);
 | 
							Timer_.start(*ManifestCreatorCallBack_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -141,10 +190,10 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void ManifestCreator::CloseBucket() {
 | 
						void ManifestCreator::CloseBucket() {}
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool ManifestCreator::GetBucketObjectContent(Aws::S3::S3Client &S3Client, const std::string &ObjectName,
 | 
						bool ManifestCreator::GetBucketObjectContent(Aws::S3::S3Client &S3Client,
 | 
				
			||||||
 | 
																	 const std::string &ObjectName,
 | 
				
			||||||
												 std::string &ObjectContent) {
 | 
																	 std::string &ObjectContent) {
 | 
				
			||||||
		Aws::S3::Model::GetObjectRequest Request;
 | 
							Aws::S3::Model::GetObjectRequest Request;
 | 
				
			||||||
		Request.SetBucket(S3BucketName_.c_str());
 | 
							Request.SetBucket(S3BucketName_.c_str());
 | 
				
			||||||
@@ -152,8 +201,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		Aws::S3::Model::GetObjectOutcome get_object_outcome = S3Client.GetObject(Request);
 | 
							Aws::S3::Model::GetObjectOutcome get_object_outcome = S3Client.GetObject(Request);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (get_object_outcome.IsSuccess())
 | 
							if (get_object_outcome.IsSuccess()) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
			auto &FileData = get_object_outcome.GetResultWithOwnership().GetBody();
 | 
								auto &FileData = get_object_outcome.GetResultWithOwnership().GetBody();
 | 
				
			||||||
			std::string O;
 | 
								std::string O;
 | 
				
			||||||
			std::ostringstream OS(O);
 | 
								std::ostringstream OS(O);
 | 
				
			||||||
@@ -169,13 +217,13 @@ namespace OpenWifi {
 | 
				
			|||||||
		static const std::string UPGRADE("-upgrade.bin");
 | 
							static const std::string UPGRADE("-upgrade.bin");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::string URIBase = "https://";
 | 
							std::string URIBase = "https://";
 | 
				
			||||||
        URIBase += MicroService::instance().ConfigGetString("s3.bucket.uri");
 | 
							URIBase += MicroServiceConfigGetString("s3.bucket.uri", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Bucket.clear();
 | 
							Bucket.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Aws::S3::Model::ListObjectsV2Request Request;
 | 
							Aws::S3::Model::ListObjectsV2Request Request;
 | 
				
			||||||
		Request.WithBucket(S3BucketName_.c_str());
 | 
							Request.WithBucket(S3BucketName_.c_str());
 | 
				
			||||||
        Aws::S3::S3Client S3Client(AwsCreds_,AwsConfig_);
 | 
							Aws::S3::S3Client S3Client(AwsCreds_, AwsConfig_, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, S3UseVirtualAdressing_);
 | 
				
			||||||
		Request.SetMaxKeys(100);
 | 
							Request.SetMaxKeys(100);
 | 
				
			||||||
		Aws::S3::Model::ListObjectsV2Outcome Outcome;
 | 
							Aws::S3::Model::ListObjectsV2Outcome Outcome;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -207,10 +255,8 @@ namespace OpenWifi {
 | 
				
			|||||||
						// std::cout << "Content: " << Content << std::endl;
 | 
											// std::cout << "Content: " << Content << std::endl;
 | 
				
			||||||
						Poco::JSON::Parser P;
 | 
											Poco::JSON::Parser P;
 | 
				
			||||||
						auto ParsedContent = P.parse(Content).extract<Poco::JSON::Object::Ptr>();
 | 
											auto ParsedContent = P.parse(Content).extract<Poco::JSON::Object::Ptr>();
 | 
				
			||||||
                        if (ParsedContent->has("image") &&
 | 
											if (ParsedContent->has("image") && ParsedContent->has("compatible") &&
 | 
				
			||||||
                            ParsedContent->has("compatible") &&
 | 
												ParsedContent->has("revision") && ParsedContent->has("timestamp")) {
 | 
				
			||||||
                            ParsedContent->has("revision") &&
 | 
					 | 
				
			||||||
                            ParsedContent->has("timestamp")) {
 | 
					 | 
				
			||||||
							auto It = Bucket.find(Release);
 | 
												auto It = Bucket.find(Release);
 | 
				
			||||||
							uint64_t TimeStamp = ParsedContent->get("timestamp");
 | 
												uint64_t TimeStamp = ParsedContent->get("timestamp");
 | 
				
			||||||
							auto Compatible = ParsedContent->get("compatible").toString();
 | 
												auto Compatible = ParsedContent->get("compatible").toString();
 | 
				
			||||||
@@ -224,8 +270,7 @@ namespace OpenWifi {
 | 
				
			|||||||
								It->second.Image = Image;
 | 
													It->second.Image = Image;
 | 
				
			||||||
								It->second.S3ContentManifest = Content;
 | 
													It->second.S3ContentManifest = Content;
 | 
				
			||||||
							} else {
 | 
												} else {
 | 
				
			||||||
                                      Bucket.emplace(Release, S3BucketEntry{
 | 
													Bucket.emplace(Release, S3BucketEntry{.Valid = false,
 | 
				
			||||||
                                        .Valid = false,
 | 
					 | 
				
			||||||
																	  .S3Name = "",
 | 
																						  .S3Name = "",
 | 
				
			||||||
																	  .S3ContentManifest = Content,
 | 
																						  .S3ContentManifest = Content,
 | 
				
			||||||
																	  .S3TimeStamp = 0,
 | 
																						  .S3TimeStamp = 0,
 | 
				
			||||||
@@ -240,7 +285,8 @@ namespace OpenWifi {
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				} else if (FileName.getExtension() == "bin") {
 | 
									} else if (FileName.getExtension() == "bin") {
 | 
				
			||||||
					//  we must remove -upgrade, so
 | 
										//  we must remove -upgrade, so
 | 
				
			||||||
                    const auto &ReleaseName = FileName.getBaseName().substr(0, FileName.getBaseName().size() - 8);
 | 
										const auto &ReleaseName =
 | 
				
			||||||
 | 
											FileName.getBaseName().substr(0, FileName.getBaseName().size() - 8);
 | 
				
			||||||
					auto It = Bucket.find(ReleaseName);
 | 
										auto It = Bucket.find(ReleaseName);
 | 
				
			||||||
					auto S3TimeStamp = (uint64_t)(Object.GetLastModified().Millis() / 1000);
 | 
										auto S3TimeStamp = (uint64_t)(Object.GetLastModified().Millis() / 1000);
 | 
				
			||||||
					uint64_t S3Size = Object.GetSize();
 | 
										uint64_t S3Size = Object.GetSize();
 | 
				
			||||||
@@ -252,8 +298,7 @@ namespace OpenWifi {
 | 
				
			|||||||
						It->second.URI = URI;
 | 
											It->second.URI = URI;
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        Bucket.emplace(ReleaseName, S3BucketEntry{
 | 
											Bucket.emplace(ReleaseName, S3BucketEntry{.Valid = false,
 | 
				
			||||||
                                .Valid = false,
 | 
					 | 
				
			||||||
																  .S3Name = "",
 | 
																					  .S3Name = "",
 | 
				
			||||||
																  .S3ContentManifest = "",
 | 
																					  .S3ContentManifest = "",
 | 
				
			||||||
																  .S3TimeStamp = S3TimeStamp,
 | 
																					  .S3TimeStamp = S3TimeStamp,
 | 
				
			||||||
@@ -281,7 +326,8 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// std::cout << "Count:" << Count << "  Runs:" << Runs << std::endl;
 | 
							// std::cout << "Count:" << Count << "  Runs:" << Runs << std::endl;
 | 
				
			||||||
		if (!Outcome.IsSuccess()) {
 | 
							if (!Outcome.IsSuccess()) {
 | 
				
			||||||
            poco_error(Logger(),fmt::format("Error while doing ListObjectsV2: {}, {}",
 | 
								poco_error(Logger(), fmt::format("Run({},{}) Error while doing ListObjectsV2: {}, {}",
 | 
				
			||||||
 | 
					                                             Runs, Count,
 | 
				
			||||||
											 std::string{Outcome.GetError().GetExceptionName()},
 | 
																 std::string{Outcome.GetError().GetExceptionName()},
 | 
				
			||||||
											 std::string{Outcome.GetError().GetMessage()}));
 | 
																 std::string{Outcome.GetError().GetMessage()}));
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
@@ -301,7 +347,6 @@ namespace OpenWifi {
 | 
				
			|||||||
			std::cout << "  Timestamp: " << Timestamp << std::endl;
 | 
								std::cout << "  Timestamp: " << Timestamp << std::endl;
 | 
				
			||||||
			std::cout << "  URI: " << URI << std::endl;
 | 
								std::cout << "  URI: " << URI << std::endl;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -312,4 +357,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,15 +2,14 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-06-02.
 | 
					// Created by stephane bourque on 2021-06-02.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALFWS_MANIFESTCREATOR_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALFWS_MANIFESTCREATOR_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <aws/core/Aws.h>
 | 
					#include <aws/core/Aws.h>
 | 
				
			||||||
#include <aws/s3/S3Client.h>
 | 
					 | 
				
			||||||
#include <aws/core/auth/AWSCredentials.h>
 | 
					#include <aws/core/auth/AWSCredentials.h>
 | 
				
			||||||
 | 
					#include <aws/s3/S3Client.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
#include "Poco/Timer.h"
 | 
					#include "Poco/Timer.h"
 | 
				
			||||||
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +28,7 @@ namespace OpenWifi {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
	typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
 | 
						typedef std::map<const std::string, S3BucketEntry> S3BucketContent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class ManifestCreator : public SubSystemServer {
 | 
						class ManifestCreator : public SubSystemServer, Poco::Runnable {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
		static auto instance() {
 | 
							static auto instance() {
 | 
				
			||||||
			static auto instance_ = new ManifestCreator;
 | 
								static auto instance_ = new ManifestCreator;
 | 
				
			||||||
@@ -43,14 +42,21 @@ namespace OpenWifi {
 | 
				
			|||||||
		bool AddManifestToDB(S3BucketContent &BucketContent);
 | 
							bool AddManifestToDB(S3BucketContent &BucketContent);
 | 
				
			||||||
		bool InitBucket();
 | 
							bool InitBucket();
 | 
				
			||||||
		bool ReadBucket(S3BucketContent &Bucket);
 | 
							bool ReadBucket(S3BucketContent &Bucket);
 | 
				
			||||||
        bool GetBucketObjectContent(Aws::S3::S3Client &S3Client, const std::string &ObjectName, std::string & ObjectContent);
 | 
							bool GetBucketObjectContent(Aws::S3::S3Client &S3Client, const std::string &ObjectName,
 | 
				
			||||||
 | 
														std::string &ObjectContent);
 | 
				
			||||||
		void CloseBucket();
 | 
							void CloseBucket();
 | 
				
			||||||
		void Print(const S3BucketContent &B);
 | 
							void Print(const S3BucketContent &B);
 | 
				
			||||||
		uint64_t MaxAge() const { return MaxAge_; }
 | 
							uint64_t MaxAge() const { return MaxAge_; }
 | 
				
			||||||
		void onTimer(Poco::Timer &timer);
 | 
							void onTimer(Poco::Timer &timer);
 | 
				
			||||||
 | 
							bool RunUpdateTask();
 | 
				
			||||||
 | 
							void run() override;
 | 
				
			||||||
 | 
							std::uint64_t LastUpdate() const { return LastUpdate_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::atomic_bool Running_ = false;
 | 
							std::atomic_bool Running_ = false;
 | 
				
			||||||
 | 
							Aws::String S3EndpointOverride_;
 | 
				
			||||||
 | 
							bool S3EndpointHttps_;
 | 
				
			||||||
 | 
							bool S3UseVirtualAdressing_;
 | 
				
			||||||
		Aws::String S3BucketName_;
 | 
							Aws::String S3BucketName_;
 | 
				
			||||||
		Aws::String S3Region_;
 | 
							Aws::String S3Region_;
 | 
				
			||||||
		Aws::String S3Key_;
 | 
							Aws::String S3Key_;
 | 
				
			||||||
@@ -62,14 +68,14 @@ namespace OpenWifi {
 | 
				
			|||||||
		uint64_t MaxAge_ = 0;
 | 
							uint64_t MaxAge_ = 0;
 | 
				
			||||||
		Poco::Timer Timer_;
 | 
							Poco::Timer Timer_;
 | 
				
			||||||
		std::unique_ptr<Poco::TimerCallback<ManifestCreator>> ManifestCreatorCallBack_;
 | 
							std::unique_ptr<Poco::TimerCallback<ManifestCreator>> ManifestCreatorCallBack_;
 | 
				
			||||||
 | 
							std::atomic_flag UpdateRunning_ = ATOMIC_FLAG_INIT;
 | 
				
			||||||
 | 
							Poco::Thread RunnerThread_;
 | 
				
			||||||
 | 
							std::uint64_t LastUpdate_ = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ManifestCreator() noexcept:
 | 
							ManifestCreator() noexcept
 | 
				
			||||||
                SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {
 | 
								: SubSystemServer("ManifestCreator", "MANIFEST-MGR", "manifestcreator") {}
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline auto ManifestCreator() { return ManifestCreator::instance(); };
 | 
						inline auto ManifestCreator() { return ManifestCreator::instance(); };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //UCENTRALFWS_MANIFESTCREATOR_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,10 @@
 | 
				
			|||||||
#include "NewCommandHandler.h"
 | 
					#include "NewCommandHandler.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fmt/format.h"
 | 
				
			||||||
 | 
					#include "framework/KafkaManager.h"
 | 
				
			||||||
 | 
					#include "nlohmann/json.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void NewCommandHandler::run() {
 | 
						void NewCommandHandler::run() {
 | 
				
			||||||
@@ -46,9 +50,15 @@ namespace OpenWifi {
 | 
				
			|||||||
							if (Command == "delete_device") {
 | 
												if (Command == "delete_device") {
 | 
				
			||||||
								auto pSerialNumber = PayloadSection["payload"]["serialNumber"];
 | 
													auto pSerialNumber = PayloadSection["payload"]["serialNumber"];
 | 
				
			||||||
								if (pSerialNumber == SerialNumber) {
 | 
													if (pSerialNumber == SerialNumber) {
 | 
				
			||||||
                                    poco_debug(Logger(),fmt::format("Removing device '{}' from upgrade history.",SerialNumber));
 | 
														poco_debug(
 | 
				
			||||||
 | 
															Logger(),
 | 
				
			||||||
 | 
															fmt::format("Removing device '{}' from upgrade history.",
 | 
				
			||||||
 | 
																		SerialNumber));
 | 
				
			||||||
									StorageService()->HistoryDB().DeleteHistory(SerialNumber);
 | 
														StorageService()->HistoryDB().DeleteHistory(SerialNumber);
 | 
				
			||||||
                                    poco_debug(Logger(),fmt::format("Removing device '{}' from device table.",SerialNumber));
 | 
														poco_debug(
 | 
				
			||||||
 | 
															Logger(),
 | 
				
			||||||
 | 
															fmt::format("Removing device '{}' from device table.",
 | 
				
			||||||
 | 
																		SerialNumber));
 | 
				
			||||||
									StorageService()->DevicesDB().DeleteDevice(SerialNumber);
 | 
														StorageService()->DevicesDB().DeleteDevice(SerialNumber);
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
@@ -62,7 +72,9 @@ namespace OpenWifi {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int NewCommandHandler::Start() {
 | 
						int NewCommandHandler::Start() {
 | 
				
			||||||
        Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->CommandReceived(s1,s2); };
 | 
							Types::TopicNotifyFunction F = [this](std::string s1, std::string s2) {
 | 
				
			||||||
 | 
								this->CommandReceived(s1, s2);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
		WatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::COMMAND, F);
 | 
							WatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::COMMAND, F);
 | 
				
			||||||
		Worker_.start(*this);
 | 
							Worker_.start(*this);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
@@ -84,4 +96,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		NewCommands_.push(std::make_pair(Key, Message));
 | 
							NewCommands_.push(std::make_pair(Key, Message));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -2,11 +2,10 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-11-21.
 | 
					// Created by stephane bourque on 2021-11-21.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OWFMS_NEWCOMMANDHANDLER_H
 | 
					#pragma once
 | 
				
			||||||
#define OWFMS_NEWCOMMANDHANDLER_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,13 +28,9 @@ namespace OpenWifi {
 | 
				
			|||||||
		int WatcherId_ = 0;
 | 
							int WatcherId_ = 0;
 | 
				
			||||||
		Types::StringPairQueue NewCommands_;
 | 
							Types::StringPairQueue NewCommands_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NewCommandHandler() noexcept:
 | 
							NewCommandHandler() noexcept
 | 
				
			||||||
            SubSystemServer("NewCommandHandler", "NEWCOM-MGR", "commanmdhandler") {
 | 
								: SubSystemServer("NewCommandHandler", "NEWCOM-MGR", "commanmdhandler") {}
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	inline auto NewCommandHandler() { return NewCommandHandler::instance(); };
 | 
						inline auto NewCommandHandler() { return NewCommandHandler::instance(); };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //OWFMS_NEWCOMMANDHANDLER_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,22 +3,29 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "NewConnectionHandler.h"
 | 
					#include "NewConnectionHandler.h"
 | 
				
			||||||
#include "framework/KafkaTopics.h"
 | 
					#include "AutoUpdater.h"
 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "DeviceCache.h"
 | 
				
			||||||
#include "framework/ow_constants.h"
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
#include "Poco/JSON/Parser.h"
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					#include "framework/KafkaTopics.h"
 | 
				
			||||||
#include "DeviceCache.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
#include "AutoUpdater.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "fmt/format.h"
 | 
				
			||||||
 | 
					#include "framework/KafkaManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
{ "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } ,
 | 
					{ "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } ,
 | 
				
			||||||
 "payload" : "{"capabilities":{"compatible":"linksys_ea8300","model":"Linksys EA8300 (Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1 2 3 4 0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}},"firmware":"OpenWrt 21.02-SNAPSHOT r16011+53-6fd65c6573 / TIP-devel-0825cb93","serial":"24f5a207a130","uuid":1623866223}}
 | 
					 "payload" : "{"capabilities":{"compatible":"linksys_ea8300","model":"Linksys EA8300
 | 
				
			||||||
 | 
					(Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1
 | 
				
			||||||
 | 
					2 3 4
 | 
				
			||||||
 | 
					0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}},"firmware":"OpenWrt
 | 
				
			||||||
 | 
					21.02-SNAPSHOT r16011+53-6fd65c6573 /
 | 
				
			||||||
 | 
					TIP-devel-0825cb93","serial":"24f5a207a130","uuid":1623866223}}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void NewConnectionHandler::run() {
 | 
						void NewConnectionHandler::run() {
 | 
				
			||||||
@@ -60,33 +67,54 @@ namespace OpenWifi {
 | 
				
			|||||||
							// std::cout << "CAPABILITIES:" << SerialNumber << std::endl;
 | 
												// std::cout << "CAPABILITIES:" << SerialNumber << std::endl;
 | 
				
			||||||
							auto CapObj = PayloadObj->getObject(uCentralProtocol::CAPABILITIES);
 | 
												auto CapObj = PayloadObj->getObject(uCentralProtocol::CAPABILITIES);
 | 
				
			||||||
							if (CapObj->has(uCentralProtocol::COMPATIBLE)) {
 | 
												if (CapObj->has(uCentralProtocol::COMPATIBLE)) {
 | 
				
			||||||
                                auto DeviceType = CapObj->get(uCentralProtocol::COMPATIBLE).toString();
 | 
													auto DeviceType =
 | 
				
			||||||
 | 
														CapObj->get(uCentralProtocol::COMPATIBLE).toString();
 | 
				
			||||||
								auto Serial = PayloadObj->get(uCentralProtocol::SERIAL).toString();
 | 
													auto Serial = PayloadObj->get(uCentralProtocol::SERIAL).toString();
 | 
				
			||||||
                                auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
 | 
													auto Revision = Storage::TrimRevision(
 | 
				
			||||||
                                // std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl;
 | 
														PayloadObj->get(uCentralProtocol::FIRMWARE).toString());
 | 
				
			||||||
 | 
													// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber <<
 | 
				
			||||||
 | 
													// " DeviceType: " << DeviceType << " Revision:" << Revision <<
 | 
				
			||||||
 | 
													// std::endl;
 | 
				
			||||||
								FMSObjects::FirmwareAgeDetails FA;
 | 
													FMSObjects::FirmwareAgeDetails FA;
 | 
				
			||||||
                                if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) {
 | 
													if (StorageService()->FirmwaresDB().ComputeFirmwareAge(
 | 
				
			||||||
                                    StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint);
 | 
															DeviceType, Revision, FA)) {
 | 
				
			||||||
 | 
														StorageService()->DevicesDB().SetDeviceRevision(
 | 
				
			||||||
 | 
															SerialNumber, Revision, DeviceType, EndPoint);
 | 
				
			||||||
									if (FA.age)
 | 
														if (FA.age)
 | 
				
			||||||
                                        poco_information(Logger(),fmt::format("Device {} connection. Firmware is {} older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age)));
 | 
															poco_information(
 | 
				
			||||||
 | 
																Logger(),
 | 
				
			||||||
 | 
																fmt::format("Device {} connection. Firmware is {} "
 | 
				
			||||||
 | 
																			"older than latest.",
 | 
				
			||||||
 | 
																			SerialNumber,
 | 
				
			||||||
 | 
																			Utils::SecondsToNiceText(FA.age)));
 | 
				
			||||||
									else
 | 
														else
 | 
				
			||||||
                                    poco_information(Logger(),fmt::format("Device {} connection. Device firmware is up to date.",SerialNumber));
 | 
															poco_information(Logger(),
 | 
				
			||||||
                                }
 | 
																			 fmt::format("Device {} connection. Device "
 | 
				
			||||||
                                else {
 | 
																						 "firmware is up to date.",
 | 
				
			||||||
                                    poco_information(Logger(),fmt::format("Device {} connection. Firmware age cannot be determined.",SerialNumber));
 | 
																						 SerialNumber));
 | 
				
			||||||
 | 
													} else {
 | 
				
			||||||
 | 
														poco_information(Logger(),
 | 
				
			||||||
 | 
																		 fmt::format("Device {} connection. Firmware "
 | 
				
			||||||
 | 
																					 "age cannot be determined.",
 | 
				
			||||||
 | 
																					 SerialNumber));
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								if (!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
 | 
													if (!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
 | 
				
			||||||
                                    // std::cout << "Device (connection): " << SerialNumber << " to be upgraded ... " << std::endl;
 | 
														// std::cout << "Device (connection): " << SerialNumber << " to
 | 
				
			||||||
 | 
														// be upgraded ... " << std::endl;
 | 
				
			||||||
									AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType);
 | 
														AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType);
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
								DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
 | 
													DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						} else if (PayloadObj->has(uCentralProtocol::DISCONNECTION)) {
 | 
											} else if (PayloadObj->has(uCentralProtocol::DISCONNECTION)) {
 | 
				
			||||||
                            auto DisconnectMessage = PayloadObj->getObject(uCentralProtocol::DISCONNECTION);
 | 
												auto DisconnectMessage =
 | 
				
			||||||
                            if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
 | 
													PayloadObj->getObject(uCentralProtocol::DISCONNECTION);
 | 
				
			||||||
                                auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString();
 | 
												if (DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) &&
 | 
				
			||||||
                                auto Timestamp = DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
 | 
													DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) {
 | 
				
			||||||
 | 
													auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER)
 | 
				
			||||||
 | 
																	.toString();
 | 
				
			||||||
 | 
													auto Timestamp =
 | 
				
			||||||
 | 
														DisconnectMessage->get(uCentralProtocol::TIMESTAMP);
 | 
				
			||||||
								StorageService()->DevicesDB().SetDeviceDisconnected(SNum, EndPoint);
 | 
													StorageService()->DevicesDB().SetDeviceDisconnected(SNum, EndPoint);
 | 
				
			||||||
								// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
 | 
													// std::cout << "DISCONNECTION:" << SerialNumber << std::endl;
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
@@ -96,13 +124,18 @@ namespace OpenWifi {
 | 
				
			|||||||
							if (PingMessage->has(uCentralProtocol::FIRMWARE) &&
 | 
												if (PingMessage->has(uCentralProtocol::FIRMWARE) &&
 | 
				
			||||||
								PingMessage->has(uCentralProtocol::SERIALNUMBER) &&
 | 
													PingMessage->has(uCentralProtocol::SERIALNUMBER) &&
 | 
				
			||||||
								PingMessage->has(uCentralProtocol::COMPATIBLE)) {
 | 
													PingMessage->has(uCentralProtocol::COMPATIBLE)) {
 | 
				
			||||||
                                auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString());
 | 
													auto Revision = Storage::TrimRevision(
 | 
				
			||||||
                                auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString();
 | 
														PingMessage->get(uCentralProtocol::FIRMWARE).toString());
 | 
				
			||||||
                                auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString();
 | 
													auto Serial =
 | 
				
			||||||
                                StorageService()->DevicesDB().SetDeviceRevision(Serial, Revision, DeviceType, EndPoint);
 | 
														PingMessage->get(uCentralProtocol::SERIALNUMBER).toString();
 | 
				
			||||||
 | 
													auto DeviceType =
 | 
				
			||||||
 | 
														PingMessage->get(uCentralProtocol::COMPATIBLE).toString();
 | 
				
			||||||
 | 
													StorageService()->DevicesDB().SetDeviceRevision(
 | 
				
			||||||
 | 
														Serial, Revision, DeviceType, EndPoint);
 | 
				
			||||||
								DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
 | 
													DeviceCache()->AddToCache(Serial, DeviceType, EndPoint, Revision);
 | 
				
			||||||
								if (!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
 | 
													if (!LatestFirmwareCache()->IsLatest(DeviceType, Revision)) {
 | 
				
			||||||
                                    // std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl;
 | 
														// std::cout << "Device(ping): " << SerialNumber << " to be
 | 
				
			||||||
 | 
														// upgraded ... " << std::endl;
 | 
				
			||||||
									AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType);
 | 
														AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType);
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
@@ -117,7 +150,9 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	int NewConnectionHandler::Start() {
 | 
						int NewConnectionHandler::Start() {
 | 
				
			||||||
		poco_information(Logger(), "Starting...");
 | 
							poco_information(Logger(), "Starting...");
 | 
				
			||||||
        Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,s2); };
 | 
							Types::TopicNotifyFunction F = [this](std::string s1, std::string s2) {
 | 
				
			||||||
 | 
								this->ConnectionReceived(s1, s2);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
		ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F);
 | 
							ConnectionWatcherId_ = KafkaManager()->RegisterTopicWatcher(KafkaTopics::CONNECTION, F);
 | 
				
			||||||
		Worker_.start(*this);
 | 
							Worker_.start(*this);
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
@@ -137,8 +172,9 @@ namespace OpenWifi {
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void NewConnectionHandler::ConnectionReceived( const std::string & Key, const std::string & Message) {
 | 
						void NewConnectionHandler::ConnectionReceived(const std::string &Key,
 | 
				
			||||||
 | 
																	  const std::string &Message) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		NewConnections_.push(std::make_pair(Key, Message));
 | 
							NewConnections_.push(std::make_pair(Key, Message));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -2,18 +2,15 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-13.
 | 
					// Created by stephane bourque on 2021-07-13.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALFMS_NEWCONNECTIONHANDLER_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALFMS_NEWCONNECTIONHANDLER_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
 | 
					#include "framework/SubSystemServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
 | 
						class NewConnectionHandler : public SubSystemServer, Poco::Runnable {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
 | 
					 | 
				
			||||||
		static auto instance() {
 | 
							static auto instance() {
 | 
				
			||||||
			static auto instance_ = new NewConnectionHandler;
 | 
								static auto instance_ = new NewConnectionHandler;
 | 
				
			||||||
			return instance_;
 | 
								return instance_;
 | 
				
			||||||
@@ -32,12 +29,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		uint64_t ConnectionWatcherId_ = 0;
 | 
							uint64_t ConnectionWatcherId_ = 0;
 | 
				
			||||||
		Types::StringPairQueue NewConnections_;
 | 
							Types::StringPairQueue NewConnections_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NewConnectionHandler() noexcept:
 | 
							NewConnectionHandler() noexcept
 | 
				
			||||||
                SubSystemServer("ConnectionHandler", "NEWCONN-MGR", "connectionhandler") {
 | 
								: SubSystemServer("ConnectionHandler", "NEWCONN-MGR", "connectionhandler") {}
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	inline auto NewConnectionHandler() { return NewConnectionHandler::instance(); };
 | 
						inline auto NewConnectionHandler() { return NewConnectionHandler::instance(); };
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif //UCENTRALFMS_NEWCONNECTIONHANDLER_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,46 +2,40 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-10-23.
 | 
					// Created by stephane bourque on 2021-10-23.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_firmwareHandler.h"
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_firmwaresHandler.h"
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
 | 
					#include "RESTAPI/RESTAPI_connectedDeviceHandler.h"
 | 
				
			||||||
#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
 | 
					#include "RESTAPI/RESTAPI_connectedDevicesHandler.h"
 | 
				
			||||||
#include "RESTAPI/RESTAPI_historyHandler.h"
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_deviceReportHandler.h"
 | 
					 | 
				
			||||||
#include "RESTAPI/RESTAPI_deviceInformation_handler.h"
 | 
					#include "RESTAPI/RESTAPI_deviceInformation_handler.h"
 | 
				
			||||||
 | 
					#include "RESTAPI/RESTAPI_deviceReportHandler.h"
 | 
				
			||||||
 | 
					#include "RESTAPI/RESTAPI_firmwareAgeHandler.h"
 | 
				
			||||||
 | 
					#include "RESTAPI/RESTAPI_firmwareHandler.h"
 | 
				
			||||||
 | 
					#include "RESTAPI/RESTAPI_firmwaresHandler.h"
 | 
				
			||||||
 | 
					#include "RESTAPI/RESTAPI_historyHandler.h"
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_SystemCommand.h"
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_SystemConfiguration.h"
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_WebSocketServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
 | 
						Poco::Net::HTTPRequestHandler *
 | 
				
			||||||
                                                            Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
 | 
						RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
 | 
				
			||||||
        return  RESTAPI_Router<
 | 
										  Poco::Logger &L, RESTAPI_GenericServerAccounting &S, uint64_t TransactionId) {
 | 
				
			||||||
                RESTAPI_firmwaresHandler,
 | 
							return RESTAPI_Router<RESTAPI_firmwaresHandler, RESTAPI_system_configuration, RESTAPI_firmwareHandler,
 | 
				
			||||||
                RESTAPI_firmwareHandler,
 | 
												  RESTAPI_system_command, RESTAPI_firmwareAgeHandler,
 | 
				
			||||||
                RESTAPI_system_command,
 | 
												  RESTAPI_connectedDevicesHandler, RESTAPI_connectedDeviceHandler,
 | 
				
			||||||
                RESTAPI_firmwareAgeHandler,
 | 
												  RESTAPI_historyHandler, RESTAPI_deviceReportHandler,
 | 
				
			||||||
                RESTAPI_connectedDevicesHandler,
 | 
												  RESTAPI_deviceInformation_handler, RESTAPI_webSocketServer>(
 | 
				
			||||||
                RESTAPI_connectedDeviceHandler,
 | 
								Path, Bindings, L, S, TransactionId);
 | 
				
			||||||
                RESTAPI_historyHandler,
 | 
					 | 
				
			||||||
                RESTAPI_deviceReportHandler,
 | 
					 | 
				
			||||||
                RESTAPI_deviceInformation_handler
 | 
					 | 
				
			||||||
            >(Path,Bindings,L, S, TransactionId);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
 | 
						Poco::Net::HTTPRequestHandler *
 | 
				
			||||||
                                                            Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t TransactionId) {
 | 
						RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings,
 | 
				
			||||||
        return RESTAPI_Router_I<
 | 
										  Poco::Logger &L, RESTAPI_GenericServerAccounting &S, uint64_t TransactionId) {
 | 
				
			||||||
                RESTAPI_firmwaresHandler,
 | 
							return RESTAPI_Router_I<RESTAPI_firmwaresHandler, RESTAPI_system_configuration, RESTAPI_firmwareHandler,
 | 
				
			||||||
                RESTAPI_firmwareHandler,
 | 
													RESTAPI_system_command, RESTAPI_firmwareAgeHandler,
 | 
				
			||||||
                RESTAPI_system_command,
 | 
													RESTAPI_connectedDevicesHandler, RESTAPI_connectedDeviceHandler,
 | 
				
			||||||
                RESTAPI_firmwareAgeHandler,
 | 
													RESTAPI_historyHandler, RESTAPI_deviceReportHandler,
 | 
				
			||||||
                RESTAPI_connectedDevicesHandler,
 | 
													RESTAPI_deviceInformation_handler>(Path, Bindings, L, S,
 | 
				
			||||||
                RESTAPI_connectedDeviceHandler,
 | 
																					   TransactionId);
 | 
				
			||||||
                RESTAPI_historyHandler,
 | 
					 | 
				
			||||||
                RESTAPI_deviceReportHandler,
 | 
					 | 
				
			||||||
                RESTAPI_deviceInformation_handler
 | 
					 | 
				
			||||||
            >(Path, Bindings, L, S, TransactionId);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -24,4 +24,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		NotFound();
 | 
							NotFound();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -5,26 +5,27 @@
 | 
				
			|||||||
#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
					#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
				
			||||||
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
					#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
 | 
						class RESTAPI_connectedDeviceHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
														   RESTAPI_GenericServerAccounting &Server,
 | 
				
			||||||
 | 
														   uint64_t TransactionId, bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
							static auto PathName() {
 | 
				
			||||||
                                          Internal) {}
 | 
								return std::list<std::string>{"/api/v1/connectedDevice/{serialNumber}"};
 | 
				
			||||||
        static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevice/{serialNumber}"};}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
					#endif // UCENTRALFMS_RESTAPI_CONNECTEDDEVICEHANDLER_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-18.
 | 
					// Created by stephane bourque on 2021-07-18.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					 | 
				
			||||||
#include "Poco/JSON/Array.h"
 | 
					#include "Poco/JSON/Array.h"
 | 
				
			||||||
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_connectedDevicesHandler.h"
 | 
					#include "RESTAPI_connectedDevicesHandler.h"
 | 
				
			||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
					#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
				
			||||||
@@ -27,4 +27,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		AnswerObj.set(RESTAPI::Protocol::DEVICES, AnswerArr);
 | 
							AnswerObj.set(RESTAPI::Protocol::DEVICES, AnswerArr);
 | 
				
			||||||
		ReturnObject(AnswerObj);
 | 
							ReturnObject(AnswerObj);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -5,27 +5,24 @@
 | 
				
			|||||||
#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
					#ifndef UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
				
			||||||
#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
					#define UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
 | 
						class RESTAPI_connectedDevicesHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
															RESTAPI_GenericServerAccounting &Server,
 | 
				
			||||||
 | 
															uint64_t TransactionId, bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
					 | 
				
			||||||
                                          Internal) {}
 | 
					 | 
				
			||||||
		static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevices"}; }
 | 
							static auto PathName() { return std::list<std::string>{"/api/v1/connectedDevices"}; }
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
					#endif // UCENTRALFMS_RESTAPI_CONNECTEDDEVICESHANDLER_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_deviceInformation_handler.h"
 | 
					#include "RESTAPI_deviceInformation_handler.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	void RESTAPI_deviceInformation_handler::DoGet() {
 | 
						void RESTAPI_deviceInformation_handler::DoGet() {
 | 
				
			||||||
@@ -44,4 +44,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		DI.to_json(Answer);
 | 
							DI.to_json(Answer);
 | 
				
			||||||
		return ReturnObject(Answer);
 | 
							return ReturnObject(Answer);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -4,23 +4,24 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_deviceInformation_handler : public RESTAPIHandler {
 | 
						class RESTAPI_deviceInformation_handler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_deviceInformation_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_deviceInformation_handler(const RESTAPIHandler::BindingMap &bindings,
 | 
				
			||||||
 | 
															  Poco::Logger &L, RESTAPI_GenericServerAccounting &Server,
 | 
				
			||||||
 | 
															  uint64_t TransactionId, bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                 Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                 TransactionId,
 | 
							static auto PathName() {
 | 
				
			||||||
                                 Internal) {}
 | 
								return std::list<std::string>{"/api/v1/deviceInformation/{serialNumber}"};
 | 
				
			||||||
        static auto PathName() { return std::list<std::string>{"/api/v1/deviceInformation/{serialNumber}"};}
 | 
							}
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,15 +3,19 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_deviceReportHandler.h"
 | 
					#include "RESTAPI_deviceReportHandler.h"
 | 
				
			||||||
#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
					 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					 | 
				
			||||||
#include "Daemon.h"
 | 
					#include "Daemon.h"
 | 
				
			||||||
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
 | 
					#include "RESTObjects/RESTAPI_FMSObjects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	void RESTAPI_deviceReportHandler::DoGet() {
 | 
						void RESTAPI_deviceReportHandler::DoGet() {
 | 
				
			||||||
        Daemon()->CreateDashboard();
 | 
							poco_information(Logger(), fmt::format("GET-DASHBOARD: {}", Requester()));
 | 
				
			||||||
        Poco::JSON::Object  O;
 | 
							FMSObjects::DeviceReport Data;
 | 
				
			||||||
        Daemon()->GetDashboard().to_json(O);
 | 
							if (Daemon()->GetDashboard().Get(Data, Logger())) {
 | 
				
			||||||
        ReturnObject(O);
 | 
								Poco::JSON::Object Answer;
 | 
				
			||||||
 | 
								Data.to_json(Answer);
 | 
				
			||||||
 | 
								return ReturnObject(Answer);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							return BadRequest(RESTAPI::Errors::InternalError);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -4,23 +4,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_deviceReportHandler : public RESTAPIHandler {
 | 
						class RESTAPI_deviceReportHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
														RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
 | 
				
			||||||
 | 
														bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
					 | 
				
			||||||
                                 Internal) {}
 | 
					 | 
				
			||||||
		static auto PathName() { return std::list<std::string>{"/api/v1/deviceReport"}; }
 | 
							static auto PathName() { return std::list<std::string>{"/api/v1/deviceReport"}; }
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,9 +4,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_firmwareAgeHandler.h"
 | 
					#include "RESTAPI_firmwareAgeHandler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "StorageService.h"
 | 
					 | 
				
			||||||
#include "Poco/JSON/Parser.h"
 | 
					 | 
				
			||||||
#include "DeviceCache.h"
 | 
					#include "DeviceCache.h"
 | 
				
			||||||
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
 | 
					#include "StorageService.h"
 | 
				
			||||||
#include "framework/ow_constants.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
@@ -17,7 +17,8 @@ namespace OpenWifi {
 | 
				
			|||||||
				DeviceCacheEntry E;
 | 
									DeviceCacheEntry E;
 | 
				
			||||||
				if (DeviceCache()->GetDevice(i, E)) {
 | 
									if (DeviceCache()->GetDevice(i, E)) {
 | 
				
			||||||
					FMSObjects::FirmwareAgeDetails FA;
 | 
										FMSObjects::FirmwareAgeDetails FA;
 | 
				
			||||||
                    if(StorageService()->FirmwaresDB().ComputeFirmwareAge(E.deviceType,E.revision,FA)) {
 | 
										if (StorageService()->FirmwaresDB().ComputeFirmwareAge(E.deviceType, E.revision,
 | 
				
			||||||
 | 
																							   FA)) {
 | 
				
			||||||
						Poco::JSON::Object O;
 | 
											Poco::JSON::Object O;
 | 
				
			||||||
						FA.to_json(O);
 | 
											FA.to_json(O);
 | 
				
			||||||
						O.set(uCentralProtocol::SERIALNUMBER, i);
 | 
											O.set(uCentralProtocol::SERIALNUMBER, i);
 | 
				
			||||||
@@ -37,8 +38,8 @@ namespace OpenWifi {
 | 
				
			|||||||
			Answer.set(RESTAPI::Protocol::AGES, Objects);
 | 
								Answer.set(RESTAPI::Protocol::AGES, Objects);
 | 
				
			||||||
			return ReturnObject(Answer);
 | 
								return ReturnObject(Answer);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
            auto DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
 | 
								auto DeviceType = ORM::Escape(GetParameter(RESTAPI::Protocol::DEVICETYPE, ""));
 | 
				
			||||||
            auto Revision = GetParameter(RESTAPI::Protocol::REVISION, "");
 | 
								auto Revision = ORM::Escape(GetParameter(RESTAPI::Protocol::REVISION, ""));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (DeviceType.empty() || Revision.empty()) {
 | 
								if (DeviceType.empty() || Revision.empty()) {
 | 
				
			||||||
				return BadRequest(RESTAPI::Errors::BothDeviceTypeRevision);
 | 
									return BadRequest(RESTAPI::Errors::BothDeviceTypeRevision);
 | 
				
			||||||
@@ -56,4 +57,4 @@ namespace OpenWifi {
 | 
				
			|||||||
			NotFound();
 | 
								NotFound();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -5,25 +5,24 @@
 | 
				
			|||||||
#ifndef UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
					#ifndef UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
				
			||||||
#define UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
					#define UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
 | 
						class RESTAPI_firmwareAgeHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
													   RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
 | 
				
			||||||
 | 
													   bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
					 | 
				
			||||||
                                          Internal) {}
 | 
					 | 
				
			||||||
		static auto PathName() { return std::list<std::string>{"/api/v1/firmwareAge"}; }
 | 
							static auto PathName() { return std::list<std::string>{"/api/v1/firmwareAge"}; }
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
					#endif // UCENTRALFMS_RESTAPI_FIRMWAREAGEHANDLER_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,19 +4,20 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "Poco/JSON/Parser.h"
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_firmwareHandler.h"
 | 
					#include "RESTAPI/RESTAPI_firmwareHandler.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					#include "framework/MicroServiceFuncs.h"
 | 
				
			||||||
#include "framework/ow_constants.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
    void
 | 
						void RESTAPI_firmwareHandler::DoPost() {
 | 
				
			||||||
    RESTAPI_firmwareHandler::DoPost() {
 | 
					 | 
				
			||||||
		const auto &Obj = ParsedBody_;
 | 
							const auto &Obj = ParsedBody_;
 | 
				
			||||||
		FMSObjects::Firmware F;
 | 
							FMSObjects::Firmware F;
 | 
				
			||||||
		if (!F.from_json(Obj)) {
 | 
							if (!F.from_json(Obj)) {
 | 
				
			||||||
			return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
 | 
								return BadRequest(RESTAPI::Errors::InvalidJSONDocument);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
        F.id = MicroService::instance().CreateUUID();
 | 
							F.id = MicroServiceCreateUUID();
 | 
				
			||||||
		if (StorageService()->FirmwaresDB().AddFirmware(F)) {
 | 
							if (StorageService()->FirmwaresDB().AddFirmware(F)) {
 | 
				
			||||||
			Poco::JSON::Object Answer;
 | 
								Poco::JSON::Object Answer;
 | 
				
			||||||
			F.to_json(Answer);
 | 
								F.to_json(Answer);
 | 
				
			||||||
@@ -25,8 +26,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		BadRequest(RESTAPI::Errors::RecordNotCreated);
 | 
							BadRequest(RESTAPI::Errors::RecordNotCreated);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void
 | 
						void RESTAPI_firmwareHandler::DoGet() {
 | 
				
			||||||
    RESTAPI_firmwareHandler::DoGet() {
 | 
					 | 
				
			||||||
		auto UUID = GetBinding(uCentralProtocol::ID, "");
 | 
							auto UUID = GetBinding(uCentralProtocol::ID, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (UUID.empty()) {
 | 
							if (UUID.empty()) {
 | 
				
			||||||
@@ -42,8 +42,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		NotFound();
 | 
							NotFound();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void
 | 
						void RESTAPI_firmwareHandler::DoDelete() {
 | 
				
			||||||
    RESTAPI_firmwareHandler::DoDelete() {
 | 
					 | 
				
			||||||
		auto UUID = GetBinding(uCentralProtocol::ID, "");
 | 
							auto UUID = GetBinding(uCentralProtocol::ID, "");
 | 
				
			||||||
		if (UUID.empty()) {
 | 
							if (UUID.empty()) {
 | 
				
			||||||
			return BadRequest(RESTAPI::Errors::MissingUUID);
 | 
								return BadRequest(RESTAPI::Errors::MissingUUID);
 | 
				
			||||||
@@ -76,9 +75,12 @@ namespace OpenWifi {
 | 
				
			|||||||
			F.description = Obj->get(RESTAPI::Protocol::DESCRIPTION).toString();
 | 
								F.description = Obj->get(RESTAPI::Protocol::DESCRIPTION).toString();
 | 
				
			||||||
		if (Obj->has(RESTAPI::Protocol::NOTES)) {
 | 
							if (Obj->has(RESTAPI::Protocol::NOTES)) {
 | 
				
			||||||
			SecurityObjects::NoteInfoVec NIV;
 | 
								SecurityObjects::NoteInfoVec NIV;
 | 
				
			||||||
            NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString());
 | 
								NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(
 | 
				
			||||||
 | 
									Obj->get(RESTAPI::Protocol::NOTES).toString());
 | 
				
			||||||
			for (auto const &i : NIV) {
 | 
								for (auto const &i : NIV) {
 | 
				
			||||||
                SecurityObjects::NoteInfo   ii{.created=(uint64_t)OpenWifi::Now(), .createdBy=UserInfo_.userinfo.email, .note=i.note};
 | 
									SecurityObjects::NoteInfo ii{.created = (uint64_t)Utils::Now(),
 | 
				
			||||||
 | 
																 .createdBy = UserInfo_.userinfo.email,
 | 
				
			||||||
 | 
																 .note = i.note};
 | 
				
			||||||
				F.notes.push_back(ii);
 | 
									F.notes.push_back(ii);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -90,4 +92,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		BadRequest(RESTAPI::Errors::RecordNotUpdated);
 | 
							BadRequest(RESTAPI::Errors::RecordNotUpdated);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -5,28 +5,27 @@
 | 
				
			|||||||
#ifndef UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
					#ifndef UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
				
			||||||
#define UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
					#define UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_firmwareHandler : public RESTAPIHandler {
 | 
						class RESTAPI_firmwareHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
													RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
 | 
				
			||||||
 | 
													bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_POST,
 | 
																		  Poco::Net::HTTPRequest::HTTP_POST,
 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_PUT,
 | 
																		  Poco::Net::HTTPRequest::HTTP_PUT,
 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_DELETE,
 | 
																		  Poco::Net::HTTPRequest::HTTP_DELETE,
 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
					 | 
				
			||||||
                                          Internal) {}
 | 
					 | 
				
			||||||
		static auto PathName() { return std::list<std::string>{"/api/v1/firmware/{id}"}; }
 | 
							static auto PathName() { return std::list<std::string>{"/api/v1/firmware/{id}"}; }
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final;
 | 
							void DoDelete() final;
 | 
				
			||||||
		void DoPost() final;
 | 
							void DoPost() final;
 | 
				
			||||||
		void DoPut() final;
 | 
							void DoPut() final;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
					#endif // UCENTRALFWS_RESTAPI_FIRMWAREHANDLER_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,18 +3,23 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_firmwaresHandler.h"
 | 
					#include "RESTAPI_firmwaresHandler.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					 | 
				
			||||||
#include "LatestFirmwareCache.h"
 | 
					#include "LatestFirmwareCache.h"
 | 
				
			||||||
 | 
					#include "StorageService.h"
 | 
				
			||||||
#include "framework/ow_constants.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
    void
 | 
						void RESTAPI_firmwaresHandler::DoGet() {
 | 
				
			||||||
    RESTAPI_firmwaresHandler::DoGet() {
 | 
							std::string DeviceType = ORM::Escape(GetParameter(RESTAPI::Protocol::DEVICETYPE, ""));
 | 
				
			||||||
        std::string DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, "");
 | 
					 | 
				
			||||||
		bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY);
 | 
							bool IdOnly = GetBoolParameter(RESTAPI::Protocol::IDONLY);
 | 
				
			||||||
		bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY);
 | 
							bool LatestOnly = GetBoolParameter(RESTAPI::Protocol::LATESTONLY);
 | 
				
			||||||
		bool rcOnly = GetBoolParameter("rcOnly");
 | 
							bool rcOnly = GetBoolParameter("rcOnly");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GetBoolParameter("updateTimeOnly")) {
 | 
				
			||||||
 | 
								Poco::JSON::Object Answer;
 | 
				
			||||||
 | 
								Answer.set("lastUpdateTime", ManifestCreator()->LastUpdate());
 | 
				
			||||||
 | 
								return ReturnObject(Answer);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (GetBoolParameter(RESTAPI::Protocol::DEVICESET)) {
 | 
							if (GetBoolParameter(RESTAPI::Protocol::DEVICESET)) {
 | 
				
			||||||
			auto Revisions = LatestFirmwareCache()->GetDevices();
 | 
								auto Revisions = LatestFirmwareCache()->GetDevices();
 | 
				
			||||||
			Poco::JSON::Array ObjectArray;
 | 
								Poco::JSON::Array ObjectArray;
 | 
				
			||||||
@@ -60,7 +65,8 @@ namespace OpenWifi {
 | 
				
			|||||||
				return NotFound();
 | 
									return NotFound();
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				std::vector<FMSObjects::Firmware> List;
 | 
									std::vector<FMSObjects::Firmware> List;
 | 
				
			||||||
                if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) {
 | 
									if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType,
 | 
				
			||||||
 | 
																					 List)) {
 | 
				
			||||||
					Poco::JSON::Array ObjectArray;
 | 
										Poco::JSON::Array ObjectArray;
 | 
				
			||||||
					for (const auto &i : List) {
 | 
										for (const auto &i : List) {
 | 
				
			||||||
						if (rcOnly && !LatestFirmwareCache::IsRC(i.revision))
 | 
											if (rcOnly && !LatestFirmwareCache::IsRC(i.revision))
 | 
				
			||||||
@@ -101,4 +107,20 @@ namespace OpenWifi {
 | 
				
			|||||||
		Answer.set(RESTAPI::Protocol::FIRMWARES, ObjectArray);
 | 
							Answer.set(RESTAPI::Protocol::FIRMWARES, ObjectArray);
 | 
				
			||||||
		ReturnObject(Answer);
 | 
							ReturnObject(Answer);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RESTAPI_firmwaresHandler::DoPut() {
 | 
				
			||||||
 | 
							if (UserInfo_.userinfo.userRole != SecurityObjects::ROOT &&
 | 
				
			||||||
 | 
								UserInfo_.userinfo.userRole != SecurityObjects::ADMIN) {
 | 
				
			||||||
 | 
								return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (GetBoolParameter("update")) {
 | 
				
			||||||
 | 
								if (ManifestCreator()->RunUpdateTask()) {
 | 
				
			||||||
 | 
									return OK();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return BadRequest(RESTAPI::Errors::FirmwareBDInProgress);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,26 +5,26 @@
 | 
				
			|||||||
#ifndef UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
					#ifndef UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
				
			||||||
#define UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
					#define UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_firmwaresHandler : public RESTAPIHandler {
 | 
						class RESTAPI_firmwaresHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
													 RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
 | 
				
			||||||
 | 
													 bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
																		  Poco::Net::HTTPRequest::HTTP_PUT,
 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
					 | 
				
			||||||
                                          Internal) {}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		static auto PathName() { return std::list<std::string>{"/api/v1/firmwares"}; }
 | 
							static auto PathName() { return std::list<std::string>{"/api/v1/firmwares"}; }
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final{};
 | 
							void DoDelete() final{};
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
        void DoPut() final {};
 | 
							void DoPut() final;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
					#endif // UCENTRALFWS_RESTAPI_FIRMWARESHANDLER_H
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,9 +7,8 @@
 | 
				
			|||||||
#include "framework/ow_constants.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
    void
 | 
						void RESTAPI_historyHandler::DoGet() {
 | 
				
			||||||
    RESTAPI_historyHandler::DoGet() {
 | 
							auto SerialNumber = ORM::Escape(GetBinding(RESTAPI::Protocol::SERIALNUMBER, ""));
 | 
				
			||||||
        auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, "");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (SerialNumber.empty()) {
 | 
							if (SerialNumber.empty()) {
 | 
				
			||||||
			return BadRequest(RESTAPI::Errors::MissingSerialNumber);
 | 
								return BadRequest(RESTAPI::Errors::MissingSerialNumber);
 | 
				
			||||||
@@ -19,7 +18,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		if (SerialNumber == "000000000000" && unknownList) {
 | 
							if (SerialNumber == "000000000000" && unknownList) {
 | 
				
			||||||
			// so let's get all the devices, filter the latest record
 | 
								// so let's get all the devices, filter the latest record
 | 
				
			||||||
			FMSObjects::DeviceCurrentInfoList L;
 | 
								FMSObjects::DeviceCurrentInfoList L;
 | 
				
			||||||
            StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices);
 | 
								StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset, QB_.Limit,
 | 
				
			||||||
 | 
																						L.devices);
 | 
				
			||||||
			Poco::JSON::Object Answer;
 | 
								Poco::JSON::Object Answer;
 | 
				
			||||||
			L.to_json(Answer);
 | 
								L.to_json(Answer);
 | 
				
			||||||
			return ReturnObject(Answer);
 | 
								return ReturnObject(Answer);
 | 
				
			||||||
@@ -62,4 +62,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		NotFound();
 | 
							NotFound();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -4,24 +4,25 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_Handler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class RESTAPI_historyHandler : public RESTAPIHandler {
 | 
						class RESTAPI_historyHandler : public RESTAPIHandler {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
        RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServer & Server, uint64_t TransactionId, bool Internal)
 | 
							RESTAPI_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L,
 | 
				
			||||||
 | 
												   RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId,
 | 
				
			||||||
 | 
												   bool Internal)
 | 
				
			||||||
			: RESTAPIHandler(bindings, L,
 | 
								: RESTAPIHandler(bindings, L,
 | 
				
			||||||
                                 std::vector<std::string>
 | 
												 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET,
 | 
				
			||||||
                                         {Poco::Net::HTTPRequest::HTTP_GET,
 | 
					 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_DELETE,
 | 
																		  Poco::Net::HTTPRequest::HTTP_DELETE,
 | 
				
			||||||
													  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
																		  Poco::Net::HTTPRequest::HTTP_OPTIONS},
 | 
				
			||||||
                                          Server,
 | 
												 Server, TransactionId, Internal) {}
 | 
				
			||||||
                                          TransactionId,
 | 
							static auto PathName() {
 | 
				
			||||||
                                          Internal) {}
 | 
								return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"};
 | 
				
			||||||
        static auto PathName() { return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"};}
 | 
							}
 | 
				
			||||||
		void DoGet() final;
 | 
							void DoGet() final;
 | 
				
			||||||
		void DoDelete() final;
 | 
							void DoDelete() final;
 | 
				
			||||||
		void DoPost() final{};
 | 
							void DoPost() final{};
 | 
				
			||||||
		void DoPut() final{};
 | 
							void DoPut() final{};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,18 +4,16 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_AnalyticsObjects.h"
 | 
					#include "RESTAPI_AnalyticsObjects.h"
 | 
				
			||||||
#include "RESTAPI_ProvObjects.h"
 | 
					#include "RESTAPI_ProvObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_to_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_from_json;
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::AnalyticsObjects {
 | 
					namespace OpenWifi::AnalyticsObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Report::reset() {
 | 
						void Report::reset() {}
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {
 | 
						void Report::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void VenueInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
						void VenueInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
		field_to_json(Obj, "id", id);
 | 
							field_to_json(Obj, "id", id);
 | 
				
			||||||
@@ -36,7 +34,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "monitorSubVenues", monitorSubVenues);
 | 
								field_from_json(Obj, "monitorSubVenues", monitorSubVenues);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -52,7 +49,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "venueList", venueList);
 | 
								field_from_json(Obj, "venueList", venueList);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -110,7 +106,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "memory", memory);
 | 
								field_from_json(Obj, "memory", memory);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -124,7 +119,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "devices", devices);
 | 
								field_from_json(Obj, "devices", devices);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -148,7 +142,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "chwidth", chwidth);
 | 
								field_from_json(Obj, "chwidth", chwidth);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -218,7 +211,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "tx_duration_delta", tx_duration_delta);
 | 
								field_from_json(Obj, "tx_duration_delta", tx_duration_delta);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -289,7 +281,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -309,7 +300,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "tx_msdu_retries", tx_msdu_retries);
 | 
								field_from_json(Obj, "tx_msdu_retries", tx_msdu_retries);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -349,7 +339,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "transmit_pct", transmit_pct);
 | 
								field_from_json(Obj, "transmit_pct", transmit_pct);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -367,7 +356,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "avg", avg);
 | 
								field_from_json(Obj, "avg", avg);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -405,7 +393,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "tx_duration_pct", tx_duration_pct);
 | 
								field_from_json(Obj, "tx_duration_pct", tx_duration_pct);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -433,7 +420,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "serialNumber", serialNumber);
 | 
								field_from_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -475,7 +461,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "tx_errors_pct", tx_errors_pct);
 | 
								field_from_json(Obj, "tx_errors_pct", tx_errors_pct);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -491,7 +476,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "stats", stats);
 | 
								field_from_json(Obj, "stats", stats);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -509,7 +493,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "count", count);
 | 
								field_from_json(Obj, "count", count);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -531,7 +514,6 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "vht", vht);
 | 
								field_from_json(Obj, "vht", vht);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -617,8 +599,7 @@ namespace OpenWifi::AnalyticsObjects {
 | 
				
			|||||||
			field_from_json(Obj, "venue_id", venue_id);
 | 
								field_from_json(Obj, "venue_id", venue_id);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi::AnalyticsObjects
 | 
				
			||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_ProvObjects.h"
 | 
					#include "RESTAPI_ProvObjects.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
@@ -38,13 +39,9 @@ namespace OpenWifi {
 | 
				
			|||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            inline bool operator<(const BoardInfo &bb) const {
 | 
								inline bool operator<(const BoardInfo &bb) const { return info.id < bb.info.id; }
 | 
				
			||||||
                return info.id < bb.info.id;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            inline bool operator==(const BoardInfo &bb) const {
 | 
								inline bool operator==(const BoardInfo &bb) const { return info.id == bb.info.id; }
 | 
				
			||||||
                return info.id == bb.info.id;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct DeviceInfo {
 | 
							struct DeviceInfo {
 | 
				
			||||||
@@ -83,15 +80,10 @@ namespace OpenWifi {
 | 
				
			|||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        enum wifi_band {
 | 
							enum wifi_band { band_2g = 0, band_5g = 1, band_6g = 2 };
 | 
				
			||||||
            band_2g = 0, band_5g = 1, band_6g = 2
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct TIDstat_entry {
 | 
							struct TIDstat_entry {
 | 
				
			||||||
            uint64_t rx_msdu = 0,
 | 
								uint64_t rx_msdu = 0, tx_msdu = 0, tx_msdu_failed = 0, tx_msdu_retries = 0;
 | 
				
			||||||
                    tx_msdu = 0,
 | 
					 | 
				
			||||||
                    tx_msdu_failed = 0,
 | 
					 | 
				
			||||||
                    tx_msdu_retries = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
@@ -110,9 +102,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct AveragePoint {
 | 
							struct AveragePoint {
 | 
				
			||||||
            double      min = 0.0,
 | 
								double min = 0.0, max = 0.0, avg = 0.0;
 | 
				
			||||||
                        max = 0.0,
 | 
					 | 
				
			||||||
                        avg = 0.0;
 | 
					 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
@@ -120,49 +110,24 @@ namespace OpenWifi {
 | 
				
			|||||||
		struct UETimePoint {
 | 
							struct UETimePoint {
 | 
				
			||||||
			std::string station;
 | 
								std::string station;
 | 
				
			||||||
			int64_t rssi = 0;
 | 
								int64_t rssi = 0;
 | 
				
			||||||
            uint64_t tx_bytes = 0,
 | 
								uint64_t tx_bytes = 0, rx_bytes = 0, tx_duration = 0, rx_packets = 0, tx_packets = 0,
 | 
				
			||||||
                    rx_bytes = 0,
 | 
										 tx_retries = 0, tx_failed = 0, connected = 0, inactive = 0;
 | 
				
			||||||
                    tx_duration = 0,
 | 
					 | 
				
			||||||
                    rx_packets = 0,
 | 
					 | 
				
			||||||
                    tx_packets = 0,
 | 
					 | 
				
			||||||
                    tx_retries = 0,
 | 
					 | 
				
			||||||
                    tx_failed = 0,
 | 
					 | 
				
			||||||
                    connected = 0,
 | 
					 | 
				
			||||||
                    inactive = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            double  tx_bytes_bw = 0.0 ,
 | 
								double tx_bytes_bw = 0.0, rx_bytes_bw = 0.0, tx_packets_bw = 0.0, rx_packets_bw = 0.0,
 | 
				
			||||||
                    rx_bytes_bw = 0.0 ,
 | 
									   tx_failed_pct = 0.0, tx_retries_pct = 0.0, tx_duration_pct = 0.0;
 | 
				
			||||||
                    tx_packets_bw = 0.0 ,
 | 
					 | 
				
			||||||
                    rx_packets_bw = 0.0 ,
 | 
					 | 
				
			||||||
                    tx_failed_pct = 0.0 ,
 | 
					 | 
				
			||||||
                    tx_retries_pct = 0.0 ,
 | 
					 | 
				
			||||||
                    tx_duration_pct = 0.0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            uint64_t    tx_bytes_delta = 0,
 | 
								uint64_t tx_bytes_delta = 0, rx_bytes_delta = 0, tx_duration_delta = 0,
 | 
				
			||||||
                        rx_bytes_delta = 0,
 | 
										 rx_packets_delta = 0, tx_packets_delta = 0, tx_retries_delta = 0,
 | 
				
			||||||
                        tx_duration_delta = 0,
 | 
					 | 
				
			||||||
                        rx_packets_delta = 0,
 | 
					 | 
				
			||||||
                        tx_packets_delta = 0,
 | 
					 | 
				
			||||||
                        tx_retries_delta = 0,
 | 
					 | 
				
			||||||
					 tx_failed_delta = 0;
 | 
										 tx_failed_delta = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            UE_rate tx_rate,
 | 
								UE_rate tx_rate, rx_rate;
 | 
				
			||||||
                    rx_rate;
 | 
					 | 
				
			||||||
			std::vector<TIDstat_entry> tidstats;
 | 
								std::vector<TIDstat_entry> tidstats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        enum SSID_MODES {
 | 
							enum SSID_MODES { unknown = 0, ap, mesh, sta, wds_ap, wds_sta, wds_repeater };
 | 
				
			||||||
            unknown = 0,
 | 
					 | 
				
			||||||
            ap,
 | 
					 | 
				
			||||||
            mesh,
 | 
					 | 
				
			||||||
            sta,
 | 
					 | 
				
			||||||
            wds_ap,
 | 
					 | 
				
			||||||
            wds_sta,
 | 
					 | 
				
			||||||
            wds_repeater
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline SSID_MODES SSID_Mode(const std::string &m) {
 | 
							inline SSID_MODES SSID_Mode(const std::string &m) {
 | 
				
			||||||
			if (m == "ap")
 | 
								if (m == "ap")
 | 
				
			||||||
@@ -181,82 +146,45 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct SSIDTimePoint {
 | 
							struct SSIDTimePoint {
 | 
				
			||||||
            std::string bssid,
 | 
								std::string bssid, mode, ssid;
 | 
				
			||||||
                        mode,
 | 
								uint64_t band = 0, channel = 0;
 | 
				
			||||||
                        ssid;
 | 
					 | 
				
			||||||
            uint64_t    band=0,
 | 
					 | 
				
			||||||
                        channel=0;
 | 
					 | 
				
			||||||
			std::vector<UETimePoint> associations;
 | 
								std::vector<UETimePoint> associations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            AveragePoint    tx_bytes_bw,
 | 
								AveragePoint tx_bytes_bw, rx_bytes_bw, tx_packets_bw, rx_packets_bw, tx_failed_pct,
 | 
				
			||||||
                            rx_bytes_bw,
 | 
									tx_retries_pct, tx_duration_pct;
 | 
				
			||||||
                            tx_packets_bw,
 | 
					 | 
				
			||||||
                            rx_packets_bw,
 | 
					 | 
				
			||||||
                            tx_failed_pct,
 | 
					 | 
				
			||||||
                            tx_retries_pct,
 | 
					 | 
				
			||||||
                            tx_duration_pct;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
		struct APTimePoint {
 | 
							struct APTimePoint {
 | 
				
			||||||
            uint64_t    collisions = 0,
 | 
								uint64_t collisions = 0, multicast = 0, rx_bytes = 0, rx_dropped = 0, rx_errors = 0,
 | 
				
			||||||
                        multicast = 0,
 | 
										 rx_packets = 0, tx_bytes = 0, tx_dropped = 0, tx_errors = 0, tx_packets = 0;
 | 
				
			||||||
                        rx_bytes = 0,
 | 
					 | 
				
			||||||
                        rx_dropped = 0,
 | 
					 | 
				
			||||||
                        rx_errors = 0,
 | 
					 | 
				
			||||||
                        rx_packets = 0,
 | 
					 | 
				
			||||||
                        tx_bytes = 0,
 | 
					 | 
				
			||||||
                        tx_dropped = 0,
 | 
					 | 
				
			||||||
                        tx_errors = 0,
 | 
					 | 
				
			||||||
                        tx_packets = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            double      tx_bytes_bw = 0.0 ,
 | 
								double tx_bytes_bw = 0.0, rx_bytes_bw = 0.0, rx_dropped_pct = 0.0, tx_dropped_pct = 0.0,
 | 
				
			||||||
                        rx_bytes_bw = 0.0 ,
 | 
									   rx_packets_bw = 0.0, tx_packets_bw = 0.0, rx_errors_pct = 0.0,
 | 
				
			||||||
                        rx_dropped_pct = 0.0,
 | 
					 | 
				
			||||||
                        tx_dropped_pct = 0.0,
 | 
					 | 
				
			||||||
                        rx_packets_bw = 0.0,
 | 
					 | 
				
			||||||
                        tx_packets_bw = 0.0,
 | 
					 | 
				
			||||||
                        rx_errors_pct = 0.0 ,
 | 
					 | 
				
			||||||
				   tx_errors_pct = 0.0;
 | 
									   tx_errors_pct = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            uint64_t    tx_bytes_delta = 0,
 | 
								uint64_t tx_bytes_delta = 0, rx_bytes_delta = 0, rx_dropped_delta = 0,
 | 
				
			||||||
                        rx_bytes_delta = 0 ,
 | 
										 tx_dropped_delta = 0, rx_packets_delta = 0, tx_packets_delta = 0,
 | 
				
			||||||
                        rx_dropped_delta = 0,
 | 
										 rx_errors_delta = 0, tx_errors_delta = 0;
 | 
				
			||||||
                        tx_dropped_delta = 0,
 | 
					 | 
				
			||||||
                        rx_packets_delta = 0,
 | 
					 | 
				
			||||||
                        tx_packets_delta = 0,
 | 
					 | 
				
			||||||
                        rx_errors_delta = 0,
 | 
					 | 
				
			||||||
                        tx_errors_delta = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct RadioTimePoint {
 | 
							struct RadioTimePoint {
 | 
				
			||||||
            uint64_t    band = 0,
 | 
								uint64_t band = 0, channel_width = 0;
 | 
				
			||||||
                        channel_width = 0;
 | 
								uint64_t active_ms = 0, busy_ms = 0, receive_ms = 0, transmit_ms = 0, tx_power = 0,
 | 
				
			||||||
            uint64_t    active_ms = 0,
 | 
					 | 
				
			||||||
                        busy_ms = 0,
 | 
					 | 
				
			||||||
                        receive_ms = 0,
 | 
					 | 
				
			||||||
                        transmit_ms = 0,
 | 
					 | 
				
			||||||
                        tx_power = 0,
 | 
					 | 
				
			||||||
					 channel = 0;
 | 
										 channel = 0;
 | 
				
			||||||
            int64_t     temperature = 0,
 | 
								int64_t temperature = 0, noise = 0;
 | 
				
			||||||
                        noise = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            double      active_pct = 0.0 ,
 | 
								double active_pct = 0.0, busy_pct = 0.0, receive_pct = 0.0, transmit_pct = 0.0;
 | 
				
			||||||
                        busy_pct = 0.0,
 | 
					 | 
				
			||||||
                        receive_pct = 0.0,
 | 
					 | 
				
			||||||
                        transmit_pct = 0.0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
		struct DeviceTimePoint {
 | 
							struct DeviceTimePoint {
 | 
				
			||||||
			std::string id;
 | 
								std::string id;
 | 
				
			||||||
			std::string boardId;
 | 
								std::string boardId;
 | 
				
			||||||
@@ -281,7 +209,8 @@ namespace OpenWifi {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			inline bool operator==(const DeviceTimePoint &rhs) const {
 | 
								inline bool operator==(const DeviceTimePoint &rhs) const {
 | 
				
			||||||
                return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber;
 | 
									return timestamp == rhs.timestamp &&
 | 
				
			||||||
 | 
										   device_info.serialNumber == rhs.device_info.serialNumber;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			inline bool operator>(const DeviceTimePoint &rhs) const {
 | 
								inline bool operator>(const DeviceTimePoint &rhs) const {
 | 
				
			||||||
@@ -293,7 +222,6 @@ namespace OpenWifi {
 | 
				
			|||||||
					return true;
 | 
										return true;
 | 
				
			||||||
				return false;
 | 
									return false;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct DeviceTimePointAnalysis {
 | 
							struct DeviceTimePointAnalysis {
 | 
				
			||||||
@@ -318,7 +246,6 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			void to_json(Poco::JSON::Object &Obj) const;
 | 
								void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct DeviceTimePointList {
 | 
							struct DeviceTimePointList {
 | 
				
			||||||
@@ -330,12 +257,9 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		struct BandwidthAnalysisEntry {
 | 
							struct BandwidthAnalysisEntry {
 | 
				
			||||||
			uint64_t timestamp = 0;
 | 
								uint64_t timestamp = 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        struct BandwidthAnalysis {
 | 
							struct BandwidthAnalysis {};
 | 
				
			||||||
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct AverageValueSigned {
 | 
							struct AverageValueSigned {
 | 
				
			||||||
			int64_t peak = 0, avg = 0, low = 0;
 | 
								int64_t peak = 0, avg = 0, low = 0;
 | 
				
			||||||
@@ -348,10 +272,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		struct RadioAnalysis {
 | 
							struct RadioAnalysis {
 | 
				
			||||||
			uint64_t timestamp = 0;
 | 
								uint64_t timestamp = 0;
 | 
				
			||||||
			AverageValueSigned noise, temperature;
 | 
								AverageValueSigned noise, temperature;
 | 
				
			||||||
            AverageValueUnsigned    active_ms,
 | 
								AverageValueUnsigned active_ms, busy_ms, transmit_ms, receive_ms;
 | 
				
			||||||
                                    busy_ms,
 | 
					 | 
				
			||||||
                                    transmit_ms,
 | 
					 | 
				
			||||||
                                    receive_ms;
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct DeviceTimePointStats {
 | 
							struct DeviceTimePointStats {
 | 
				
			||||||
@@ -375,7 +296,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct WifiClientHistory {
 | 
							struct WifiClientHistory {
 | 
				
			||||||
            uint64_t        timestamp=OpenWifi::Now();
 | 
								uint64_t timestamp = Utils::Now();
 | 
				
			||||||
			std::string station_id;
 | 
								std::string station_id;
 | 
				
			||||||
			std::string bssid;
 | 
								std::string bssid;
 | 
				
			||||||
			std::string ssid;
 | 
								std::string ssid;
 | 
				
			||||||
@@ -417,6 +338,6 @@ namespace OpenWifi {
 | 
				
			|||||||
			bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
								bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
						} // namespace AnalyticsObjects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi
 | 
				
			||||||
@@ -3,10 +3,10 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_CertObjects.h"
 | 
					#include "RESTAPI_CertObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_to_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_from_json;
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::CertObjects {
 | 
					namespace OpenWifi::CertObjects {
 | 
				
			||||||
	void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
 | 
						void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -30,6 +30,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		field_to_json(Obj, "revoked", revoked);
 | 
							field_to_json(Obj, "revoked", revoked);
 | 
				
			||||||
		field_to_json(Obj, "revokeCount", revokeCount);
 | 
							field_to_json(Obj, "revokeCount", revokeCount);
 | 
				
			||||||
		field_to_json(Obj, "synched", synched);
 | 
							field_to_json(Obj, "synched", synched);
 | 
				
			||||||
 | 
							field_to_json(Obj, "expiryDate", expiryDate);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -54,6 +55,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
			field_from_json(Obj, "revoked", revoked);
 | 
								field_from_json(Obj, "revoked", revoked);
 | 
				
			||||||
			field_from_json(Obj, "revokeCount", revokeCount);
 | 
								field_from_json(Obj, "revokeCount", revokeCount);
 | 
				
			||||||
			field_from_json(Obj, "synched", synched);
 | 
								field_from_json(Obj, "synched", synched);
 | 
				
			||||||
 | 
								field_from_json(Obj, "expiryDate", expiryDate);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -154,6 +156,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		field_to_json(Obj, "submitted", submitted);
 | 
							field_to_json(Obj, "submitted", submitted);
 | 
				
			||||||
		field_to_json(Obj, "started", started);
 | 
							field_to_json(Obj, "started", started);
 | 
				
			||||||
		field_to_json(Obj, "completed", completed);
 | 
							field_to_json(Obj, "completed", completed);
 | 
				
			||||||
 | 
							field_to_json(Obj, "requesterUsername", requesterUsername);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -171,6 +174,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
			field_from_json(Obj, "submitted", submitted);
 | 
								field_from_json(Obj, "submitted", submitted);
 | 
				
			||||||
			field_from_json(Obj, "started", started);
 | 
								field_from_json(Obj, "started", started);
 | 
				
			||||||
			field_from_json(Obj, "completed", completed);
 | 
								field_from_json(Obj, "completed", completed);
 | 
				
			||||||
 | 
								field_from_json(Obj, "requesterUsername", requesterUsername);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -205,4 +209,4 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		monthlyNumberOfCerts.clear();
 | 
							monthlyNumberOfCerts.clear();
 | 
				
			||||||
		monthlyNumberOfCertsPerOrgPerYear.clear();
 | 
							monthlyNumberOfCertsPerOrgPerYear.clear();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi::CertObjects
 | 
				
			||||||
@@ -4,9 +4,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					 | 
				
			||||||
#include "RESTObjects/RESTAPI_SecurityObjects.h"
 | 
					#include "RESTObjects/RESTAPI_SecurityObjects.h"
 | 
				
			||||||
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::CertObjects {
 | 
					namespace OpenWifi::CertObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,6 +31,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		uint64_t revoked = 0;
 | 
							uint64_t revoked = 0;
 | 
				
			||||||
		uint64_t revokeCount = 0;
 | 
							uint64_t revokeCount = 0;
 | 
				
			||||||
		uint64_t synched = 0;
 | 
							uint64_t synched = 0;
 | 
				
			||||||
 | 
							uint64_t expiryDate = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
@@ -91,6 +92,7 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		uint64_t submitted = 0;
 | 
							uint64_t submitted = 0;
 | 
				
			||||||
		uint64_t started = 0;
 | 
							uint64_t started = 0;
 | 
				
			||||||
		uint64_t completed = 0;
 | 
							uint64_t completed = 0;
 | 
				
			||||||
 | 
							std::string requesterUsername;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
@@ -119,4 +121,4 @@ namespace OpenWifi::CertObjects {
 | 
				
			|||||||
		void reset();
 | 
							void reset();
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi::CertObjects
 | 
				
			||||||
@@ -3,10 +3,11 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_FMSObjects.h"
 | 
					#include "RESTAPI_FMSObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_to_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_from_json;
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::FMSObjects {
 | 
					namespace OpenWifi::FMSObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,7 +54,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "created", created);
 | 
								field_from_json(Obj, "created", created);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -67,7 +67,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "firmwares", firmwares);
 | 
								field_from_json(Obj, "firmwares", firmwares);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -101,7 +100,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "id", id);
 | 
								field_from_json(Obj, "id", id);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -115,7 +113,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "deviceTypes", deviceTypes);
 | 
								field_from_json(Obj, "deviceTypes", deviceTypes);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -141,7 +138,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "upgraded", upgraded);
 | 
								field_from_json(Obj, "upgraded", upgraded);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -155,7 +151,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "deviceTypes", history);
 | 
								field_from_json(Obj, "deviceTypes", history);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -181,7 +176,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "latest", latest);
 | 
								field_from_json(Obj, "latest", latest);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -205,7 +199,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "status", status);
 | 
								field_from_json(Obj, "status", status);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -233,7 +226,7 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
		UnknownFirmwares_.clear();
 | 
							UnknownFirmwares_.clear();
 | 
				
			||||||
		totalSecondsOld_.clear();
 | 
							totalSecondsOld_.clear();
 | 
				
			||||||
		numberOfDevices = 0;
 | 
							numberOfDevices = 0;
 | 
				
			||||||
        snapshot = OpenWifi::Now();
 | 
							snapshot = Utils::Now();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DeviceReport::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool DeviceReport::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -241,7 +234,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -269,7 +261,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "latestFirmwareURI", latestFirmwareURI);
 | 
								field_from_json(Obj, "latestFirmwareURI", latestFirmwareURI);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -287,7 +278,6 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "upgraded", upgraded);
 | 
								field_from_json(Obj, "upgraded", upgraded);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -301,9 +291,8 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
			field_from_json(Obj, "devices", devices);
 | 
								field_from_json(Obj, "devices", devices);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi::FMSObjects
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -156,4 +156,4 @@ namespace OpenWifi::FMSObjects {
 | 
				
			|||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					} // namespace OpenWifi::FMSObjects
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,16 +11,18 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "Daemon.h"
 | 
					#include "Daemon.h"
 | 
				
			||||||
#ifdef TIP_GATEWAY_SERVICE
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
#include "DeviceRegistry.h"
 | 
					#include "AP_WS_Server.h"
 | 
				
			||||||
#include "CapabilitiesCache.h"
 | 
					#include "CapabilitiesCache.h"
 | 
				
			||||||
 | 
					#include "RADIUSSessionTracker.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_GWobjects.h"
 | 
					#include "RESTAPI_GWobjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_to_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_from_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::EmbedDocument;
 | 
					using OpenWifi::RESTAPI_utils::EmbedDocument;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::GWObjects {
 | 
					namespace OpenWifi::GWObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,6 +30,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "serialNumber", SerialNumber);
 | 
							field_to_json(Obj, "serialNumber", SerialNumber);
 | 
				
			||||||
#ifdef TIP_GATEWAY_SERVICE
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
		field_to_json(Obj, "deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
 | 
							field_to_json(Obj, "deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasRADIUSSessions", RADIUSSessionTracker()->HasSessions(SerialNumber));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		field_to_json(Obj, "macAddress", MACAddress);
 | 
							field_to_json(Obj, "macAddress", MACAddress);
 | 
				
			||||||
		field_to_json(Obj, "manufacturer", Manufacturer);
 | 
							field_to_json(Obj, "manufacturer", Manufacturer);
 | 
				
			||||||
@@ -49,6 +52,13 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "entity", entity);
 | 
							field_to_json(Obj, "entity", entity);
 | 
				
			||||||
		field_to_json(Obj, "modified", modified);
 | 
							field_to_json(Obj, "modified", modified);
 | 
				
			||||||
		field_to_json(Obj, "locale", locale);
 | 
							field_to_json(Obj, "locale", locale);
 | 
				
			||||||
 | 
							field_to_json(Obj, "restrictedDevice", restrictedDevice);
 | 
				
			||||||
 | 
							field_to_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
				
			||||||
 | 
							field_to_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
				
			||||||
 | 
							field_to_json(Obj, "restrictionDetails", restrictionDetails);
 | 
				
			||||||
 | 
							field_to_json(Obj, "pendingUUID", pendingUUID);
 | 
				
			||||||
 | 
							field_to_json(Obj, "simulated", simulated);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastRecordedContact", lastRecordedContact);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
 | 
						void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -57,8 +67,8 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
#ifdef TIP_GATEWAY_SERVICE
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
		ConnectionState ConState;
 | 
							ConnectionState ConState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (DeviceRegistry()->GetState(SerialNumber, ConState)) {
 | 
							if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
 | 
				
			||||||
			ConState.to_json(Obj);
 | 
								ConState.to_json(SerialNumber,Obj);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			field_to_json(Obj, "ipAddress", "");
 | 
								field_to_json(Obj, "ipAddress", "");
 | 
				
			||||||
			field_to_json(Obj, "txBytes", (uint64_t)0);
 | 
								field_to_json(Obj, "txBytes", (uint64_t)0);
 | 
				
			||||||
@@ -69,6 +79,14 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
								field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
				
			||||||
			field_to_json(Obj, "associations_2G", (uint64_t)0);
 | 
								field_to_json(Obj, "associations_2G", (uint64_t)0);
 | 
				
			||||||
			field_to_json(Obj, "associations_5G", (uint64_t)0);
 | 
								field_to_json(Obj, "associations_5G", (uint64_t)0);
 | 
				
			||||||
 | 
								field_to_json(Obj, "associations_6G", (uint64_t)0);
 | 
				
			||||||
 | 
								field_to_json(Obj, "hasRADIUSSessions", false);
 | 
				
			||||||
 | 
								field_to_json(Obj, "hasGPS", ConState.hasGPS);
 | 
				
			||||||
 | 
								field_to_json(Obj, "sanity", ConState.sanity);
 | 
				
			||||||
 | 
								field_to_json(Obj, "memoryUsed", ConState.memoryUsed);
 | 
				
			||||||
 | 
								field_to_json(Obj, "sanity", ConState.sanity);
 | 
				
			||||||
 | 
								field_to_json(Obj, "load", ConState.load);
 | 
				
			||||||
 | 
								field_to_json(Obj, "temperature", ConState.temperature);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -78,16 +96,32 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_from_json(Obj, "serialNumber", SerialNumber);
 | 
								field_from_json(Obj, "serialNumber", SerialNumber);
 | 
				
			||||||
			field_from_json(Obj, "deviceType", DeviceType);
 | 
								field_from_json(Obj, "deviceType", DeviceType);
 | 
				
			||||||
			field_from_json(Obj, "macAddress", MACAddress);
 | 
								field_from_json(Obj, "macAddress", MACAddress);
 | 
				
			||||||
 | 
								field_from_json(Obj, "manufacturer", Manufacturer);
 | 
				
			||||||
 | 
								field_from_json(Obj, "UUID", UUID);
 | 
				
			||||||
			field_from_json(Obj, "configuration", Configuration);
 | 
								field_from_json(Obj, "configuration", Configuration);
 | 
				
			||||||
			field_from_json(Obj, "notes", Notes);
 | 
								field_from_json(Obj, "notes", Notes);
 | 
				
			||||||
			field_from_json(Obj,"manufacturer",Manufacturer);
 | 
								field_from_json(Obj, "createdTimestamp", CreationTimestamp);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastConfigurationChange", LastConfigurationChange);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastConfigurationDownload", LastConfigurationDownload);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastFWUpdate", LastFWUpdate);
 | 
				
			||||||
			field_from_json(Obj, "owner", Owner);
 | 
								field_from_json(Obj, "owner", Owner);
 | 
				
			||||||
			field_from_json(Obj, "location", Location);
 | 
								field_from_json(Obj, "location", Location);
 | 
				
			||||||
			field_from_json(Obj, "venue", Venue);
 | 
								field_from_json(Obj, "venue", Venue);
 | 
				
			||||||
 | 
								field_from_json(Obj, "firmware", Firmware);
 | 
				
			||||||
			field_from_json(Obj, "compatible", Compatible);
 | 
								field_from_json(Obj, "compatible", Compatible);
 | 
				
			||||||
 | 
								field_from_json(Obj, "fwUpdatePolicy", FWUpdatePolicy);
 | 
				
			||||||
 | 
								field_from_json(Obj, "devicePassword", DevicePassword);
 | 
				
			||||||
			field_from_json(Obj, "subscriber", subscriber);
 | 
								field_from_json(Obj, "subscriber", subscriber);
 | 
				
			||||||
			field_from_json(Obj, "entity", entity);
 | 
								field_from_json(Obj, "entity", entity);
 | 
				
			||||||
 | 
								field_from_json(Obj, "modified", modified);
 | 
				
			||||||
			field_from_json(Obj, "locale", locale);
 | 
								field_from_json(Obj, "locale", locale);
 | 
				
			||||||
 | 
								field_from_json(Obj, "restrictedDevice", restrictedDevice);
 | 
				
			||||||
 | 
								field_from_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
				
			||||||
 | 
								field_from_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
				
			||||||
 | 
								field_from_json(Obj, "restrictionDetails", restrictionDetails);
 | 
				
			||||||
 | 
								field_from_json(Obj, "pendingUUID", pendingUUID);
 | 
				
			||||||
 | 
								field_from_json(Obj, "simulated", simulated);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastRecordedContact", lastRecordedContact);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -95,8 +129,9 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Device::Print() const {
 | 
						void Device::Print() const {
 | 
				
			||||||
		std::cout << "Device: " << SerialNumber << " DeviceType:" << DeviceType << " MACAddress:" << MACAddress << " Manufacturer:"
 | 
							std::cout << "Device: " << SerialNumber << " DeviceType:" << DeviceType
 | 
				
			||||||
				  << Manufacturer << " " << Configuration << std::endl;
 | 
									  << " MACAddress:" << MACAddress << " Manufacturer:" << Manufacturer << " "
 | 
				
			||||||
 | 
									  << Configuration << std::endl;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Statistics::to_json(Poco::JSON::Object &Obj) const {
 | 
						void Statistics::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -136,6 +171,31 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "lastModified", LastModified);
 | 
							field_to_json(Obj, "lastModified", LastModified);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DefaultFirmware::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "deviceType", deviceType);
 | 
				
			||||||
 | 
							field_to_json(Obj, "description", Description);
 | 
				
			||||||
 | 
							field_to_json(Obj, "uri", uri);
 | 
				
			||||||
 | 
							field_to_json(Obj, "revision", revision);
 | 
				
			||||||
 | 
							field_to_json(Obj, "imageCreationDate", imageCreationDate);
 | 
				
			||||||
 | 
							field_to_json(Obj, "created", Created);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastModified", LastModified);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DefaultFirmware::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "deviceType", deviceType);
 | 
				
			||||||
 | 
								field_from_json(Obj, "description", Description);
 | 
				
			||||||
 | 
								field_from_json(Obj, "uri", uri);
 | 
				
			||||||
 | 
								field_from_json(Obj, "revision", revision);
 | 
				
			||||||
 | 
								field_from_json(Obj, "imageCreationDate", imageCreationDate);
 | 
				
			||||||
 | 
								field_from_json(Obj, "created", Created);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastModified", LastModified);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void CommandDetails::to_json(Poco::JSON::Object &Obj) const {
 | 
						void CommandDetails::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
		EmbedDocument("details", Obj, Details);
 | 
							EmbedDocument("details", Obj, Details);
 | 
				
			||||||
		EmbedDocument("results", Obj, Results);
 | 
							EmbedDocument("results", Obj, Results);
 | 
				
			||||||
@@ -154,6 +214,8 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "waitingForFile", WaitingForFile);
 | 
							field_to_json(Obj, "waitingForFile", WaitingForFile);
 | 
				
			||||||
		field_to_json(Obj, "attachFile", AttachDate);
 | 
							field_to_json(Obj, "attachFile", AttachDate);
 | 
				
			||||||
		field_to_json(Obj, "executionTime", executionTime);
 | 
							field_to_json(Obj, "executionTime", executionTime);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastTry", lastTry);
 | 
				
			||||||
 | 
							field_to_json(Obj, "deferred", deferred);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -187,7 +249,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
 | 
						void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber, Poco::JSON::Object &Obj)  {
 | 
				
			||||||
		field_to_json(Obj, "ipAddress", Address);
 | 
							field_to_json(Obj, "ipAddress", Address);
 | 
				
			||||||
		field_to_json(Obj, "txBytes", TX);
 | 
							field_to_json(Obj, "txBytes", TX);
 | 
				
			||||||
		field_to_json(Obj, "rxBytes", RX);
 | 
							field_to_json(Obj, "rxBytes", RX);
 | 
				
			||||||
@@ -198,6 +260,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "lastContact", LastContact);
 | 
							field_to_json(Obj, "lastContact", LastContact);
 | 
				
			||||||
		field_to_json(Obj, "associations_2G", Associations_2G);
 | 
							field_to_json(Obj, "associations_2G", Associations_2G);
 | 
				
			||||||
		field_to_json(Obj, "associations_5G", Associations_5G);
 | 
							field_to_json(Obj, "associations_5G", Associations_5G);
 | 
				
			||||||
 | 
							field_to_json(Obj, "associations_6G", Associations_6G);
 | 
				
			||||||
		field_to_json(Obj, "webSocketClients", webSocketClients);
 | 
							field_to_json(Obj, "webSocketClients", webSocketClients);
 | 
				
			||||||
		field_to_json(Obj, "websocketPackets", websocketPackets);
 | 
							field_to_json(Obj, "websocketPackets", websocketPackets);
 | 
				
			||||||
		field_to_json(Obj, "kafkaClients", kafkaClients);
 | 
							field_to_json(Obj, "kafkaClients", kafkaClients);
 | 
				
			||||||
@@ -206,31 +269,58 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "started", started);
 | 
							field_to_json(Obj, "started", started);
 | 
				
			||||||
		field_to_json(Obj, "sessionId", sessionId);
 | 
							field_to_json(Obj, "sessionId", sessionId);
 | 
				
			||||||
		field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
 | 
							field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
 | 
				
			||||||
		field_to_json(Obj,"totalConnectionTime", OpenWifi::Now() - started);
 | 
							field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
 | 
				
			||||||
 | 
							field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
 | 
				
			||||||
 | 
							field_to_json(Obj, "connectReason", connectReason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
							hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
 | 
				
			||||||
 | 
							AP_WS_Server()->ExtendedAttributes(SerialNumber, hasGPS, sanity,
 | 
				
			||||||
 | 
															   memoryUsed,
 | 
				
			||||||
 | 
															   load,
 | 
				
			||||||
 | 
															   temperature);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasGPS", hasGPS);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sanity", sanity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "memoryUsed", memoryUsed);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sanity", sanity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "load", load);
 | 
				
			||||||
 | 
							field_to_json(Obj, "temperature", temperature);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (VerifiedCertificate) {
 | 
							switch (VerifiedCertificate) {
 | 
				
			||||||
		case NO_CERTIFICATE:
 | 
							case NO_CERTIFICATE:
 | 
				
			||||||
				field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break;
 | 
								field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case VALID_CERTIFICATE:
 | 
							case VALID_CERTIFICATE:
 | 
				
			||||||
				field_to_json(Obj,"verifiedCertificate", "VALID_CERTIFICATE"); break;
 | 
								field_to_json(Obj, "verifiedCertificate", "VALID_CERTIFICATE");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case MISMATCH_SERIAL:
 | 
							case MISMATCH_SERIAL:
 | 
				
			||||||
				field_to_json(Obj,"verifiedCertificate", "MISMATCH_SERIAL"); break;
 | 
								field_to_json(Obj, "verifiedCertificate", "MISMATCH_SERIAL");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case VERIFIED:
 | 
							case VERIFIED:
 | 
				
			||||||
				field_to_json(Obj,"verifiedCertificate", "VERIFIED"); break;
 | 
								field_to_json(Obj, "verifiedCertificate", "VERIFIED");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SIMULATED:
 | 
				
			||||||
 | 
								field_to_json(Obj, "verifiedCertificate", "SIMULATED");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
				field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break;
 | 
								field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
 | 
						void DeviceConnectionStatistics::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
		field_to_json(Obj, "averageConnectionTime", averageConnectionTime);
 | 
							field_to_json(Obj, "averageConnectionTime", averageConnectionTime);
 | 
				
			||||||
		field_to_json(Obj, "connectedDevices", connectedDevices);
 | 
							field_to_json(Obj, "connectedDevices", connectedDevices);
 | 
				
			||||||
 | 
							field_to_json(Obj, "connectingDevices", connectingDevices);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DeviceConnectionStatistics::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool DeviceConnectionStatistics::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			field_from_json(Obj, "averageConnectionTime", averageConnectionTime);
 | 
								field_from_json(Obj, "averageConnectionTime", averageConnectionTime);
 | 
				
			||||||
			field_from_json(Obj, "connectedDevices", connectedDevices);
 | 
								field_from_json(Obj, "connectedDevices", connectedDevices);
 | 
				
			||||||
 | 
								field_from_json(Obj, "connectingDevices", connectingDevices);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -283,7 +373,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		lastContact.clear();
 | 
							lastContact.clear();
 | 
				
			||||||
		associations.clear();
 | 
							associations.clear();
 | 
				
			||||||
		numberOfDevices = 0;
 | 
							numberOfDevices = 0;
 | 
				
			||||||
		snapshot = OpenWifi::Now();
 | 
							snapshot = Utils::Now();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const {
 | 
						void CapabilitiesModel::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -295,9 +385,12 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "serialNumber", serialNumber);
 | 
							field_to_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
		field_to_json(Obj, "timeout", timeout);
 | 
							field_to_json(Obj, "timeout", timeout);
 | 
				
			||||||
		field_to_json(Obj, "type", type);
 | 
							field_to_json(Obj, "type", type);
 | 
				
			||||||
		field_to_json(Obj,"script",script);
 | 
					 | 
				
			||||||
		field_to_json(Obj, "scriptId", scriptId);
 | 
							field_to_json(Obj, "scriptId", scriptId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "script", script);
 | 
				
			||||||
		field_to_json(Obj, "when", when);
 | 
							field_to_json(Obj, "when", when);
 | 
				
			||||||
 | 
							field_to_json(Obj, "signature", signature);
 | 
				
			||||||
 | 
							field_to_json(Obj, "deferred", deferred);
 | 
				
			||||||
 | 
							field_to_json(Obj, "uri", uri);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -308,6 +401,9 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_from_json(Obj, "script", script);
 | 
								field_from_json(Obj, "script", script);
 | 
				
			||||||
			field_from_json(Obj, "scriptId", scriptId);
 | 
								field_from_json(Obj, "scriptId", scriptId);
 | 
				
			||||||
			field_from_json(Obj, "when", when);
 | 
								field_from_json(Obj, "when", when);
 | 
				
			||||||
 | 
								field_from_json(Obj, "signature", signature);
 | 
				
			||||||
 | 
								field_from_json(Obj, "deferred", deferred);
 | 
				
			||||||
 | 
								field_from_json(Obj, "uri", uri);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -334,6 +430,10 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "acctConfig", acctConfig);
 | 
							field_to_json(Obj, "acctConfig", acctConfig);
 | 
				
			||||||
		field_to_json(Obj, "coaConfig", coaConfig);
 | 
							field_to_json(Obj, "coaConfig", coaConfig);
 | 
				
			||||||
		field_to_json(Obj, "useByDefault", useByDefault);
 | 
							field_to_json(Obj, "useByDefault", useByDefault);
 | 
				
			||||||
 | 
							field_to_json(Obj, "radsecKeepAlive", radsecKeepAlive);
 | 
				
			||||||
 | 
							field_to_json(Obj, "poolProxyIp", poolProxyIp);
 | 
				
			||||||
 | 
							field_to_json(Obj, "radsecPoolType", radsecPoolType);
 | 
				
			||||||
 | 
							field_to_json(Obj, "enabled", enabled);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -344,6 +444,10 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_from_json(Obj, "acctConfig", acctConfig);
 | 
								field_from_json(Obj, "acctConfig", acctConfig);
 | 
				
			||||||
			field_from_json(Obj, "coaConfig", coaConfig);
 | 
								field_from_json(Obj, "coaConfig", coaConfig);
 | 
				
			||||||
			field_from_json(Obj, "useByDefault", useByDefault);
 | 
								field_from_json(Obj, "useByDefault", useByDefault);
 | 
				
			||||||
 | 
								field_from_json(Obj, "radsecKeepAlive", radsecKeepAlive);
 | 
				
			||||||
 | 
								field_from_json(Obj, "poolProxyIp", poolProxyIp);
 | 
				
			||||||
 | 
								field_from_json(Obj, "radsecPoolType", radsecPoolType);
 | 
				
			||||||
 | 
								field_from_json(Obj, "enabled", enabled);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -379,6 +483,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "secret", secret);
 | 
							field_to_json(Obj, "secret", secret);
 | 
				
			||||||
		field_to_json(Obj, "certificate", certificate);
 | 
							field_to_json(Obj, "certificate", certificate);
 | 
				
			||||||
		field_to_json(Obj, "radsec", radsec);
 | 
							field_to_json(Obj, "radsec", radsec);
 | 
				
			||||||
 | 
							field_to_json(Obj, "allowSelfSigned", allowSelfSigned);
 | 
				
			||||||
		field_to_json(Obj, "radsecPort", radsecPort);
 | 
							field_to_json(Obj, "radsecPort", radsecPort);
 | 
				
			||||||
		field_to_json(Obj, "radsecSecret", radsecSecret);
 | 
							field_to_json(Obj, "radsecSecret", radsecSecret);
 | 
				
			||||||
		field_to_json(Obj, "radsecCacerts", radsecCacerts);
 | 
							field_to_json(Obj, "radsecCacerts", radsecCacerts);
 | 
				
			||||||
@@ -397,6 +502,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_from_json(Obj, "secret", secret);
 | 
								field_from_json(Obj, "secret", secret);
 | 
				
			||||||
			field_from_json(Obj, "certificate", certificate);
 | 
								field_from_json(Obj, "certificate", certificate);
 | 
				
			||||||
			field_from_json(Obj, "radsec", radsec);
 | 
								field_from_json(Obj, "radsec", radsec);
 | 
				
			||||||
 | 
								field_from_json(Obj, "allowSelfSigned", allowSelfSigned);
 | 
				
			||||||
			field_from_json(Obj, "radsecSecret", radsecSecret);
 | 
								field_from_json(Obj, "radsecSecret", radsecSecret);
 | 
				
			||||||
			field_from_json(Obj, "radsecPort", radsecPort);
 | 
								field_from_json(Obj, "radsecPort", radsecPort);
 | 
				
			||||||
			field_from_json(Obj, "radsecCacerts", radsecCacerts);
 | 
								field_from_json(Obj, "radsecCacerts", radsecCacerts);
 | 
				
			||||||
@@ -409,5 +515,204 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ScriptEntry::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "id", id);
 | 
				
			||||||
 | 
							field_to_json(Obj, "name", name);
 | 
				
			||||||
 | 
							field_to_json(Obj, "description", description);
 | 
				
			||||||
 | 
							field_to_json(Obj, "uri", uri);
 | 
				
			||||||
 | 
							field_to_json(Obj, "content", content);
 | 
				
			||||||
 | 
							field_to_json(Obj, "version", version);
 | 
				
			||||||
 | 
							field_to_json(Obj, "type", type);
 | 
				
			||||||
 | 
							field_to_json(Obj, "created", created);
 | 
				
			||||||
 | 
							field_to_json(Obj, "modified", modified);
 | 
				
			||||||
 | 
							field_to_json(Obj, "author", author);
 | 
				
			||||||
 | 
							field_to_json(Obj, "restricted", restricted);
 | 
				
			||||||
 | 
							field_to_json(Obj, "deferred", deferred);
 | 
				
			||||||
 | 
							field_to_json(Obj, "timeout", timeout);
 | 
				
			||||||
 | 
							field_to_json(Obj, "defaultUploadURI", defaultUploadURI);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ScriptEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "id", id);
 | 
				
			||||||
 | 
								field_from_json(Obj, "name", name);
 | 
				
			||||||
 | 
								field_from_json(Obj, "description", description);
 | 
				
			||||||
 | 
								field_from_json(Obj, "uri", uri);
 | 
				
			||||||
 | 
								field_from_json(Obj, "content", content);
 | 
				
			||||||
 | 
								field_from_json(Obj, "version", version);
 | 
				
			||||||
 | 
								field_from_json(Obj, "type", type);
 | 
				
			||||||
 | 
								field_from_json(Obj, "created", created);
 | 
				
			||||||
 | 
								field_from_json(Obj, "modified", modified);
 | 
				
			||||||
 | 
								field_from_json(Obj, "author", author);
 | 
				
			||||||
 | 
								field_from_json(Obj, "restricted", restricted);
 | 
				
			||||||
 | 
								field_from_json(Obj, "deferred", deferred);
 | 
				
			||||||
 | 
								field_from_json(Obj, "timeout", timeout);
 | 
				
			||||||
 | 
								field_from_json(Obj, "defaultUploadURI", defaultUploadURI);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ScriptEntryList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "scripts", scripts);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ScriptEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "scripts", scripts);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RangeOptions::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_IR", NO_IR);
 | 
				
			||||||
 | 
							field_to_json(Obj, "AUTO_BW", AUTO_BW);
 | 
				
			||||||
 | 
							field_to_json(Obj, "DFS", DFS);
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_OUTDOOR", NO_OUTDOOR);
 | 
				
			||||||
 | 
							field_to_json(Obj, "wmmrule_ETSI", wmmrule_ETSI);
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_OFDM", NO_OFDM);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void FrequencyRange::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "from", from);
 | 
				
			||||||
 | 
							field_to_json(Obj, "to", to);
 | 
				
			||||||
 | 
							field_to_json(Obj, "channelWidth", channelWidth);
 | 
				
			||||||
 | 
							field_to_json(Obj, "powerDb", powerDb);
 | 
				
			||||||
 | 
							field_to_json(Obj, "options", options);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RegulatoryCountryInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "country", country);
 | 
				
			||||||
 | 
							field_to_json(Obj, "domain", domain);
 | 
				
			||||||
 | 
							field_to_json(Obj, "ranges", ranges);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "vendor", vendor);
 | 
				
			||||||
 | 
							field_to_json(Obj, "algo", algo);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceRestrictionsKeyInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "vendor", vendor);
 | 
				
			||||||
 | 
								field_from_json(Obj, "algo", algo);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void DeviceRestrictions::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "dfs", dfs);
 | 
				
			||||||
 | 
							field_to_json(Obj, "ssh", ssh);
 | 
				
			||||||
 | 
							field_to_json(Obj, "rtty", rtty);
 | 
				
			||||||
 | 
							field_to_json(Obj, "tty", tty);
 | 
				
			||||||
 | 
							field_to_json(Obj, "developer", developer);
 | 
				
			||||||
 | 
							field_to_json(Obj, "upgrade", upgrade);
 | 
				
			||||||
 | 
							field_to_json(Obj, "commands", commands);
 | 
				
			||||||
 | 
							field_to_json(Obj, "country", country);
 | 
				
			||||||
 | 
							field_to_json(Obj, "key_info", key_info);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceRestrictions::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "dfs", dfs);
 | 
				
			||||||
 | 
								field_from_json(Obj, "ssh", ssh);
 | 
				
			||||||
 | 
								field_from_json(Obj, "rtty", rtty);
 | 
				
			||||||
 | 
								field_from_json(Obj, "tty", tty);
 | 
				
			||||||
 | 
								field_from_json(Obj, "developer", developer);
 | 
				
			||||||
 | 
								field_from_json(Obj, "upgrade", upgrade);
 | 
				
			||||||
 | 
								field_from_json(Obj, "commands", commands);
 | 
				
			||||||
 | 
								field_from_json(Obj, "country", country);
 | 
				
			||||||
 | 
								field_from_json(Obj, "key_info", key_info);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceRestrictionsKeyInfo::operator!=(
 | 
				
			||||||
 | 
							const OpenWifi::GWObjects::DeviceRestrictionsKeyInfo &T) const {
 | 
				
			||||||
 | 
							return (T.algo != algo) || (T.vendor != vendor);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceRestrictions::operator!=(const OpenWifi::GWObjects::DeviceRestrictions &T) const {
 | 
				
			||||||
 | 
							return ((T.dfs != dfs) || (T.rtty != rtty) || (T.upgrade != upgrade) ||
 | 
				
			||||||
 | 
									(T.commands != commands) || (T.developer != developer) || (T.ssh != ssh) ||
 | 
				
			||||||
 | 
									(T.key_info != key_info) || (T.country != country));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RADIUSSession::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "started", started);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastTransaction", lastTransaction);
 | 
				
			||||||
 | 
							field_to_json(Obj, "destination", destination);
 | 
				
			||||||
 | 
							field_to_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
							field_to_json(Obj, "userName", userName);
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingSessionId", accountingSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputPackets", inputPackets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputPackets", outputPackets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputOctets", inputOctets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputOctets", outputOctets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputGigaWords", inputGigaWords);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputGigaWords", outputGigaWords);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sessionTime", sessionTime);
 | 
				
			||||||
 | 
							field_to_json(Obj, "callingStationId", callingStationId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "interface", interface);
 | 
				
			||||||
 | 
							field_to_json(Obj, "secret", secret);
 | 
				
			||||||
 | 
							field_to_json(Obj, "nasId", nasId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "calledStationId", calledStationId);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RADIUSSessionList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "sessions", sessions);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RadiusCoADMParameters::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingSessionId", accountingSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "callingStationId", callingStationId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "userName", userName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool RadiusCoADMParameters::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "accountingSessionId", accountingSessionId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "callingStationId", callingStationId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
 | 
				
			||||||
 | 
								field_from_json(Obj, "userName", userName);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceTransferRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
								field_from_json(Obj, "server", server);
 | 
				
			||||||
 | 
								field_from_json(Obj, "port", port);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool DeviceCertificateUpdateRequest::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
								field_from_json(Obj, "encodedCertificate", encodedCertificate);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi::GWObjects
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,14 +11,13 @@
 | 
				
			|||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
#include "RESTAPI_SecurityObjects.h"
 | 
					#include "RESTAPI_SecurityObjects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
					#include <RADIUS_helpers.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::GWObjects {
 | 
					namespace OpenWifi::GWObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enum CertificateValidation {
 | 
						enum CertificateValidation { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED, SIMULATED };
 | 
				
			||||||
		NO_CERTIFICATE,
 | 
					 | 
				
			||||||
		VALID_CERTIFICATE,
 | 
					 | 
				
			||||||
		MISMATCH_SERIAL,
 | 
					 | 
				
			||||||
		VERIFIED
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ConnectionState {
 | 
						struct ConnectionState {
 | 
				
			||||||
		uint64_t MessageCount = 0;
 | 
							uint64_t MessageCount = 0;
 | 
				
			||||||
@@ -28,6 +27,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		uint64_t TX = 0, RX = 0;
 | 
							uint64_t TX = 0, RX = 0;
 | 
				
			||||||
		uint64_t Associations_2G = 0;
 | 
							uint64_t Associations_2G = 0;
 | 
				
			||||||
		uint64_t Associations_5G = 0;
 | 
							uint64_t Associations_5G = 0;
 | 
				
			||||||
 | 
							uint64_t Associations_6G = 0;
 | 
				
			||||||
		bool Connected = false;
 | 
							bool Connected = false;
 | 
				
			||||||
		uint64_t LastContact = 0;
 | 
							uint64_t LastContact = 0;
 | 
				
			||||||
		std::string Firmware;
 | 
							std::string Firmware;
 | 
				
			||||||
@@ -41,8 +41,43 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		uint64_t started = 0;
 | 
							uint64_t started = 0;
 | 
				
			||||||
		uint64_t sessionId = 0;
 | 
							uint64_t sessionId = 0;
 | 
				
			||||||
		double connectionCompletionTime = 0.0;
 | 
							double connectionCompletionTime = 0.0;
 | 
				
			||||||
 | 
							std::uint64_t certificateExpiryDate = 0;
 | 
				
			||||||
 | 
							std::uint64_t hasRADIUSSessions = 0;
 | 
				
			||||||
 | 
							bool hasGPS = false;
 | 
				
			||||||
 | 
							std::uint64_t sanity=0;
 | 
				
			||||||
 | 
							std::double_t memoryUsed=0.0;
 | 
				
			||||||
 | 
							std::double_t load=0.0;
 | 
				
			||||||
 | 
							std::double_t temperature=0.0;
 | 
				
			||||||
 | 
							std::string 	connectReason;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(const std::string &SerialNumber, Poco::JSON::Object &Obj) ;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DeviceRestrictionsKeyInfo {
 | 
				
			||||||
 | 
							std::string vendor;
 | 
				
			||||||
 | 
							std::string algo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool operator!=(const DeviceRestrictionsKeyInfo &b) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DeviceRestrictions {
 | 
				
			||||||
 | 
							bool dfs = false;
 | 
				
			||||||
 | 
							bool ssh = false;
 | 
				
			||||||
 | 
							bool rtty = false;
 | 
				
			||||||
 | 
							bool tty = false;
 | 
				
			||||||
 | 
							bool developer = false;
 | 
				
			||||||
 | 
							bool upgrade = false;
 | 
				
			||||||
 | 
							bool commands = false;
 | 
				
			||||||
 | 
							std::vector<std::string> country;
 | 
				
			||||||
 | 
							DeviceRestrictionsKeyInfo key_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool operator!=(const DeviceRestrictions &D) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct Device {
 | 
						struct Device {
 | 
				
			||||||
@@ -68,6 +103,13 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		std::string entity;
 | 
							std::string entity;
 | 
				
			||||||
		uint64_t modified = 0;
 | 
							uint64_t modified = 0;
 | 
				
			||||||
		std::string locale;
 | 
							std::string locale;
 | 
				
			||||||
 | 
							bool restrictedDevice = false;
 | 
				
			||||||
 | 
							std::string pendingConfiguration;
 | 
				
			||||||
 | 
							std::string pendingConfigurationCmd;
 | 
				
			||||||
 | 
							DeviceRestrictions restrictionDetails;
 | 
				
			||||||
 | 
							std::uint64_t pendingUUID = 0;
 | 
				
			||||||
 | 
							bool simulated=false;
 | 
				
			||||||
 | 
							std::uint64_t lastRecordedContact=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		void to_json_with_status(Poco::JSON::Object &Obj) const;
 | 
							void to_json_with_status(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
@@ -78,6 +120,8 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
	struct DeviceConnectionStatistics {
 | 
						struct DeviceConnectionStatistics {
 | 
				
			||||||
		std::uint64_t connectedDevices = 0;
 | 
							std::uint64_t connectedDevices = 0;
 | 
				
			||||||
		std::uint64_t averageConnectionTime = 0;
 | 
							std::uint64_t averageConnectionTime = 0;
 | 
				
			||||||
 | 
							std::uint64_t connectingDevices = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
@@ -138,6 +182,26 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DefaultFirmware {
 | 
				
			||||||
 | 
							std::string deviceType;
 | 
				
			||||||
 | 
							std::string Description;
 | 
				
			||||||
 | 
							std::string uri;
 | 
				
			||||||
 | 
							std::string revision;
 | 
				
			||||||
 | 
							uint64_t imageCreationDate;
 | 
				
			||||||
 | 
							uint64_t Created;
 | 
				
			||||||
 | 
							uint64_t LastModified;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DefaultFirmwareList {
 | 
				
			||||||
 | 
							std::vector<DefaultFirmware>	firmwares;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct CommandDetails {
 | 
						struct CommandDetails {
 | 
				
			||||||
		std::string UUID;
 | 
							std::string UUID;
 | 
				
			||||||
		std::string SerialNumber;
 | 
							std::string SerialNumber;
 | 
				
			||||||
@@ -158,7 +222,11 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		uint64_t AttachSize = 0;
 | 
							uint64_t AttachSize = 0;
 | 
				
			||||||
		std::string AttachType;
 | 
							std::string AttachType;
 | 
				
			||||||
		double executionTime = 0.0;
 | 
							double executionTime = 0.0;
 | 
				
			||||||
 | 
							std::uint64_t lastTry = 0;
 | 
				
			||||||
 | 
							bool deferred = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct BlackListedDevice {
 | 
						struct BlackListedDevice {
 | 
				
			||||||
@@ -211,13 +279,44 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct ScriptEntry {
 | 
				
			||||||
 | 
							std::string id;
 | 
				
			||||||
 | 
							std::string name;
 | 
				
			||||||
 | 
							std::string description;
 | 
				
			||||||
 | 
							std::string uri;
 | 
				
			||||||
 | 
							std::string content;
 | 
				
			||||||
 | 
							std::string version;
 | 
				
			||||||
 | 
							std::string type;
 | 
				
			||||||
 | 
							std::uint64_t created;
 | 
				
			||||||
 | 
							std::uint64_t modified;
 | 
				
			||||||
 | 
							std::string author;
 | 
				
			||||||
 | 
							Types::StringVec restricted;
 | 
				
			||||||
 | 
							bool deferred = false;
 | 
				
			||||||
 | 
							std::uint64_t timeout = 30;
 | 
				
			||||||
 | 
							std::string defaultUploadURI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct ScriptEntryList {
 | 
				
			||||||
 | 
							std::vector<ScriptEntry> scripts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ScriptRequest {
 | 
						struct ScriptRequest {
 | 
				
			||||||
		uint64_t 	timeout=30;
 | 
					 | 
				
			||||||
		std::string serialNumber;
 | 
							std::string serialNumber;
 | 
				
			||||||
 | 
							uint64_t timeout = 30;
 | 
				
			||||||
		std::string type;
 | 
							std::string type;
 | 
				
			||||||
		std::string script;
 | 
							std::string script;
 | 
				
			||||||
		std::string scriptId;
 | 
							std::string scriptId;
 | 
				
			||||||
		uint64_t 	when=0;
 | 
							std::uint64_t when;
 | 
				
			||||||
 | 
							std::string signature;
 | 
				
			||||||
 | 
							bool deferred;
 | 
				
			||||||
 | 
							std::string uri;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
@@ -230,6 +329,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		std::string secret;
 | 
							std::string secret;
 | 
				
			||||||
		std::string certificate;
 | 
							std::string certificate;
 | 
				
			||||||
		bool radsec = false;
 | 
							bool radsec = false;
 | 
				
			||||||
 | 
							bool allowSelfSigned = false;
 | 
				
			||||||
		uint16_t radsecPort = 2083;
 | 
							uint16_t radsecPort = 2083;
 | 
				
			||||||
		std::string radsecSecret;
 | 
							std::string radsecSecret;
 | 
				
			||||||
		std::string radsecKey;
 | 
							std::string radsecKey;
 | 
				
			||||||
@@ -260,6 +360,10 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		RadiusProxyServerConfig acctConfig;
 | 
							RadiusProxyServerConfig acctConfig;
 | 
				
			||||||
		RadiusProxyServerConfig coaConfig;
 | 
							RadiusProxyServerConfig coaConfig;
 | 
				
			||||||
		bool useByDefault = false;
 | 
							bool useByDefault = false;
 | 
				
			||||||
 | 
							std::string 	radsecPoolType;
 | 
				
			||||||
 | 
							std::string 	poolProxyIp;
 | 
				
			||||||
 | 
							std::uint64_t 	radsecKeepAlive=25;
 | 
				
			||||||
 | 
							bool			enabled=true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
@@ -271,4 +375,140 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RangeOptions {
 | 
				
			||||||
 | 
							bool NO_IR=false;
 | 
				
			||||||
 | 
							bool AUTO_BW=false;
 | 
				
			||||||
 | 
							bool DFS=false;
 | 
				
			||||||
 | 
							bool NO_OUTDOOR=false;
 | 
				
			||||||
 | 
							bool wmmrule_ETSI=false;
 | 
				
			||||||
 | 
							bool NO_OFDM=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct FrequencyRange {
 | 
				
			||||||
 | 
							float from = 0.0;
 | 
				
			||||||
 | 
							float to = 0.0;
 | 
				
			||||||
 | 
							int channelWidth = 0;
 | 
				
			||||||
 | 
							int powerDb = 0;
 | 
				
			||||||
 | 
							RangeOptions    options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RegulatoryCountryInfo {
 | 
				
			||||||
 | 
							std::string country;
 | 
				
			||||||
 | 
							std::string domain;
 | 
				
			||||||
 | 
							std::vector<FrequencyRange>   ranges;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						using RegulatoryInfoCountryMap = std::map<std::string,RegulatoryCountryInfo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RADIUSSession {
 | 
				
			||||||
 | 
							std::uint64_t 			started=0,
 | 
				
			||||||
 | 
													lastTransaction=0;
 | 
				
			||||||
 | 
							std::string 			serialNumber,
 | 
				
			||||||
 | 
													destination,
 | 
				
			||||||
 | 
													userName,
 | 
				
			||||||
 | 
										 			accountingSessionId,
 | 
				
			||||||
 | 
													accountingMultiSessionId,
 | 
				
			||||||
 | 
										 			callingStationId,
 | 
				
			||||||
 | 
													chargeableUserIdentity,
 | 
				
			||||||
 | 
													secret,
 | 
				
			||||||
 | 
													interface,
 | 
				
			||||||
 | 
													nasId;
 | 
				
			||||||
 | 
							std::uint64_t 			inputPackets = 0,
 | 
				
			||||||
 | 
													outputPackets = 0,
 | 
				
			||||||
 | 
													inputOctets = 0,
 | 
				
			||||||
 | 
													outputOctets = 0,
 | 
				
			||||||
 | 
													inputGigaWords = 0,
 | 
				
			||||||
 | 
													outputGigaWords = 0;
 | 
				
			||||||
 | 
							std::uint32_t 			sessionTime = 0;
 | 
				
			||||||
 | 
							std::string 			calledStationId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
							RADIUS::RadiusPacket	accountingPacket;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RADIUSSessionList {
 | 
				
			||||||
 | 
							std::vector<RADIUSSession>	sessions;
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RadiusCoADMParameters {
 | 
				
			||||||
 | 
							std::string 			accountingSessionId,
 | 
				
			||||||
 | 
													accountingMultiSessionId,
 | 
				
			||||||
 | 
													callingStationId,
 | 
				
			||||||
 | 
													chargeableUserIdentity,
 | 
				
			||||||
 | 
													userName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enum class RadiusPoolStrategy {
 | 
				
			||||||
 | 
							round_robin, random, weighted, unknown
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enum class RadiusEndpointType {
 | 
				
			||||||
 | 
							generic, radsec, globalreach, orion, unknown
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static inline RadiusEndpointType RadiusEndpointType(const std::string &T) {
 | 
				
			||||||
 | 
							if(T=="generic") return RadiusEndpointType::generic;
 | 
				
			||||||
 | 
							if(T=="radsec") return RadiusEndpointType::radsec;
 | 
				
			||||||
 | 
							if(T=="globalreach") return RadiusEndpointType::globalreach;
 | 
				
			||||||
 | 
							if(T=="orion") return RadiusEndpointType::orion;
 | 
				
			||||||
 | 
							return RadiusEndpointType::unknown;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static inline RadiusPoolStrategy RadiusPoolStrategy(const std::string &T) {
 | 
				
			||||||
 | 
							if(T=="round_robin") return RadiusPoolStrategy::round_robin;
 | 
				
			||||||
 | 
							if(T=="random") return RadiusPoolStrategy::random;
 | 
				
			||||||
 | 
							if(T=="weighted") return RadiusPoolStrategy::weighted;
 | 
				
			||||||
 | 
							return RadiusPoolStrategy::unknown;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static inline std::string to_string(enum RadiusEndpointType T) {
 | 
				
			||||||
 | 
							switch(T) {
 | 
				
			||||||
 | 
							case RadiusEndpointType::generic: return "generic";
 | 
				
			||||||
 | 
							case RadiusEndpointType::radsec: return "radsec";
 | 
				
			||||||
 | 
							case RadiusEndpointType::globalreach: return "globalreach";
 | 
				
			||||||
 | 
							case RadiusEndpointType::orion: return "orion";
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return "unknown";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static inline std::string to_string(enum RadiusPoolStrategy T) {
 | 
				
			||||||
 | 
							switch(T) {
 | 
				
			||||||
 | 
							case RadiusPoolStrategy::round_robin: return "round_robin";
 | 
				
			||||||
 | 
							case RadiusPoolStrategy::random: return "random";
 | 
				
			||||||
 | 
							case RadiusPoolStrategy::weighted: return "weighted";
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return "unknown";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DeviceTransferRequest {
 | 
				
			||||||
 | 
							std::string 	serialNumber;
 | 
				
			||||||
 | 
							std::string 	server;
 | 
				
			||||||
 | 
							std::uint64_t 	port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct DeviceCertificateUpdateRequest {
 | 
				
			||||||
 | 
							std::string 	serialNumber;
 | 
				
			||||||
 | 
							std::string 	encodedCertificate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi::GWObjects
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										103
									
								
								src/RESTObjects/RESTAPI_OWLSobjects.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by stephane bourque on 2021-08-31.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::EmbedDocument;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "RESTAPI_OWLSobjects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SIM -> 0x53/0x073, 0x49/0x69, 0x4d/0x6d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenWifi::OWLSObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void SimulationDetails::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "id", id);
 | 
				
			||||||
 | 
							field_to_json(Obj, "name", name);
 | 
				
			||||||
 | 
							field_to_json(Obj, "gateway", gateway);
 | 
				
			||||||
 | 
							field_to_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
							field_to_json(Obj, "key", key);
 | 
				
			||||||
 | 
							field_to_json(Obj, "macPrefix", macPrefix);
 | 
				
			||||||
 | 
							field_to_json(Obj, "deviceType", deviceType);
 | 
				
			||||||
 | 
							field_to_json(Obj, "devices", devices);
 | 
				
			||||||
 | 
							field_to_json(Obj, "healthCheckInterval", healthCheckInterval);
 | 
				
			||||||
 | 
							field_to_json(Obj, "stateInterval", stateInterval);
 | 
				
			||||||
 | 
							field_to_json(Obj, "minAssociations", minAssociations);
 | 
				
			||||||
 | 
							field_to_json(Obj, "maxAssociations", maxAssociations);
 | 
				
			||||||
 | 
							field_to_json(Obj, "minClients", minClients);
 | 
				
			||||||
 | 
							field_to_json(Obj, "maxClients", maxClients);
 | 
				
			||||||
 | 
							field_to_json(Obj, "simulationLength", simulationLength);
 | 
				
			||||||
 | 
							field_to_json(Obj, "threads", threads);
 | 
				
			||||||
 | 
							field_to_json(Obj, "clientInterval", clientInterval);
 | 
				
			||||||
 | 
							field_to_json(Obj, "keepAlive", keepAlive);
 | 
				
			||||||
 | 
							field_to_json(Obj, "reconnectInterval", reconnectInterval);
 | 
				
			||||||
 | 
							field_to_json(Obj, "concurrentDevices", concurrentDevices);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool SimulationDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "id", id);
 | 
				
			||||||
 | 
								field_from_json(Obj, "name", name);
 | 
				
			||||||
 | 
								field_from_json(Obj, "gateway", gateway);
 | 
				
			||||||
 | 
								field_from_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
								field_from_json(Obj, "key", key);
 | 
				
			||||||
 | 
								field_from_json(Obj, "macPrefix", macPrefix);
 | 
				
			||||||
 | 
								field_from_json(Obj, "deviceType", deviceType);
 | 
				
			||||||
 | 
								field_from_json(Obj, "devices", devices);
 | 
				
			||||||
 | 
								field_from_json(Obj, "healthCheckInterval", healthCheckInterval);
 | 
				
			||||||
 | 
								field_from_json(Obj, "stateInterval", stateInterval);
 | 
				
			||||||
 | 
								field_from_json(Obj, "minAssociations", minAssociations);
 | 
				
			||||||
 | 
								field_from_json(Obj, "maxAssociations", maxAssociations);
 | 
				
			||||||
 | 
								field_from_json(Obj, "minClients", minClients);
 | 
				
			||||||
 | 
								field_from_json(Obj, "maxClients", maxClients);
 | 
				
			||||||
 | 
								field_from_json(Obj, "simulationLength", simulationLength);
 | 
				
			||||||
 | 
								field_from_json(Obj, "threads", threads);
 | 
				
			||||||
 | 
								field_from_json(Obj, "clientInterval", clientInterval);
 | 
				
			||||||
 | 
								field_from_json(Obj, "keepAlive", keepAlive);
 | 
				
			||||||
 | 
								field_from_json(Obj, "reconnectInterval", reconnectInterval);
 | 
				
			||||||
 | 
								field_from_json(Obj, "concurrentDevices", concurrentDevices);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void SimulationDetailsList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "list", list);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool SimulationDetailsList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "list", list);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void SimulationStatus::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "id", id);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "simulationId", simulationId);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "state", state);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "tx", tx);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "rx", rx);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "msgsTx", msgsTx);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "msgsRx", msgsRx);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "liveDevices", liveDevices);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "timeToFullDevices", timeToFullDevices);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "startTime", startTime);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "endTime", endTime);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "errorDevices", errorDevices);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "owner", owner);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "expectedDevices", expectedDevices);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool Dashboard::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) { return true; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void Dashboard::reset() {}
 | 
				
			||||||
 | 
					} // namespace OpenWifi::OWLSObjects
 | 
				
			||||||
							
								
								
									
										75
									
								
								src/RESTObjects/RESTAPI_OWLSobjects.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by stephane bourque on 2021-08-31.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
 | 
				
			||||||
 | 
					#define UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenWifi::OWLSObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct SimulationDetails {
 | 
				
			||||||
 | 
							std::string id;
 | 
				
			||||||
 | 
							std::string name;
 | 
				
			||||||
 | 
							std::string gateway;
 | 
				
			||||||
 | 
							std::string certificate;
 | 
				
			||||||
 | 
							std::string key;
 | 
				
			||||||
 | 
							std::string macPrefix;
 | 
				
			||||||
 | 
							std::string deviceType;
 | 
				
			||||||
 | 
							uint64_t devices = 5;
 | 
				
			||||||
 | 
							uint64_t healthCheckInterval = 60;
 | 
				
			||||||
 | 
							uint64_t stateInterval = 60;
 | 
				
			||||||
 | 
							uint64_t minAssociations = 1;
 | 
				
			||||||
 | 
							uint64_t maxAssociations = 3;
 | 
				
			||||||
 | 
							uint64_t minClients = 1;
 | 
				
			||||||
 | 
							uint64_t maxClients = 3;
 | 
				
			||||||
 | 
							uint64_t simulationLength = 60 * 60;
 | 
				
			||||||
 | 
							uint64_t threads = 16;
 | 
				
			||||||
 | 
							uint64_t clientInterval = 1;
 | 
				
			||||||
 | 
							uint64_t keepAlive = 300;
 | 
				
			||||||
 | 
							uint64_t reconnectInterval = 30;
 | 
				
			||||||
 | 
							uint64_t concurrentDevices = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct SimulationDetailsList {
 | 
				
			||||||
 | 
							std::vector<SimulationDetails> list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct SimulationStatus {
 | 
				
			||||||
 | 
					        std::string id;
 | 
				
			||||||
 | 
					        std::string simulationId;
 | 
				
			||||||
 | 
					        std::string state;
 | 
				
			||||||
 | 
					        uint64_t tx;
 | 
				
			||||||
 | 
					        uint64_t rx;
 | 
				
			||||||
 | 
					        uint64_t msgsTx;
 | 
				
			||||||
 | 
					        uint64_t msgsRx;
 | 
				
			||||||
 | 
					        uint64_t liveDevices;
 | 
				
			||||||
 | 
					        uint64_t timeToFullDevices;
 | 
				
			||||||
 | 
					        uint64_t startTime;
 | 
				
			||||||
 | 
					        uint64_t endTime;
 | 
				
			||||||
 | 
					        uint64_t errorDevices;
 | 
				
			||||||
 | 
					        std::string owner;
 | 
				
			||||||
 | 
					        uint64_t expectedDevices;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct Dashboard {
 | 
				
			||||||
 | 
							int O;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
							void reset();
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi::OWLSObjects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // UCENTRALSIM_RESTAPI_OWLSOBJECTS_H
 | 
				
			||||||
@@ -6,12 +6,13 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "RESTAPI_ProvObjects.h"
 | 
					#include "RESTAPI_ProvObjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/MicroServiceFuncs.h"
 | 
				
			||||||
 | 
					#include "framework/RESTAPI_utils.h"
 | 
				
			||||||
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_to_json;
 | 
					 | 
				
			||||||
using OpenWifi::RESTAPI_utils::field_from_json;
 | 
					using OpenWifi::RESTAPI_utils::field_from_json;
 | 
				
			||||||
 | 
					using OpenWifi::RESTAPI_utils::field_to_json;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::ProvObjects {
 | 
					namespace OpenWifi::ProvObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,7 +37,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "tags", tags);
 | 
								field_from_json(Obj, "tags", tags);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -56,7 +56,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "policy", policy);
 | 
								field_from_json(Obj, "policy", policy);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -76,7 +75,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "entity", entity);
 | 
								field_from_json(Obj, "entity", entity);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -120,7 +118,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "configurations", configurations);
 | 
								field_from_json(Obj, "configurations", configurations);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -136,7 +133,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "child", child);
 | 
								field_from_json(Obj, "child", child);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -188,7 +184,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "boards", boards);
 | 
								field_from_json(Obj, "boards", boards);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -260,7 +255,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ServiceClassList::to_json(Poco::JSON::Object &Obj) const {
 | 
						void ServiceClassList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -351,7 +345,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
								field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -391,7 +384,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
								field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -423,7 +415,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "geoCode", geoCode);
 | 
								field_from_json(Obj, "geoCode", geoCode);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -437,7 +428,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "locations", locations);
 | 
								field_from_json(Obj, "locations", locations);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -483,7 +473,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
								field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -527,7 +516,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
								field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -563,7 +551,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "accessPIN", accessPIN);
 | 
								field_from_json(Obj, "accessPIN", accessPIN);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -577,7 +564,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "contacts", contacts);
 | 
								field_from_json(Obj, "contacts", contacts);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -600,6 +586,10 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
		field_to_json(Obj, "devClass", devClass);
 | 
							field_to_json(Obj, "devClass", devClass);
 | 
				
			||||||
		field_to_json(Obj, "locale", locale);
 | 
							field_to_json(Obj, "locale", locale);
 | 
				
			||||||
		field_to_json(Obj, "realMacAddress", realMacAddress);
 | 
							field_to_json(Obj, "realMacAddress", realMacAddress);
 | 
				
			||||||
 | 
							field_to_json(Obj, "doNotAllowOverrides", doNotAllowOverrides);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "imported", imported);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "connected", connected);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "platform", platform);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -621,9 +611,12 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "devClass", devClass);
 | 
								field_from_json(Obj, "devClass", devClass);
 | 
				
			||||||
			field_from_json(Obj, "locale", locale);
 | 
								field_from_json(Obj, "locale", locale);
 | 
				
			||||||
			field_from_json(Obj, "realMacAddress", realMacAddress);
 | 
								field_from_json(Obj, "realMacAddress", realMacAddress);
 | 
				
			||||||
 | 
								field_from_json(Obj, "doNotAllowOverrides", doNotAllowOverrides);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "imported", imported);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "connected", connected);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "platform", platform);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -643,7 +636,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "errorCode", errorCode);
 | 
								field_from_json(Obj, "errorCode", errorCode);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -657,7 +649,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "taglist", taglist);
 | 
								field_from_json(Obj, "taglist", taglist);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
@@ -677,7 +668,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "configuration", configuration);
 | 
								field_from_json(Obj, "configuration", configuration);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -711,7 +701,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "deviceRules", deviceRules);
 | 
								field_from_json(Obj, "deviceRules", deviceRules);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -721,9 +710,7 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
		field_to_json(Obj, "devices", tenants);
 | 
							field_to_json(Obj, "devices", tenants);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Report::reset() {
 | 
						void Report::reset() { tenants.clear(); }
 | 
				
			||||||
        tenants.clear();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ExpandedUseEntry::to_json(Poco::JSON::Object &Obj) const {
 | 
						void ExpandedUseEntry::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
		field_to_json(Obj, "uuid", uuid);
 | 
							field_to_json(Obj, "uuid", uuid);
 | 
				
			||||||
@@ -738,7 +725,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "description", description);
 | 
								field_from_json(Obj, "description", description);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -754,7 +740,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "entries", entries);
 | 
								field_from_json(Obj, "entries", entries);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -768,21 +753,17 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "entries", entries);
 | 
								field_from_json(Obj, "entries", entries);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void UuidList::to_json(Poco::JSON::Object &Obj) const {
 | 
						void UuidList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "list", list); }
 | 
				
			||||||
        field_to_json(Obj, "list", list);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool UuidList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool UuidList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			field_from_json(Obj, "list", list);
 | 
								field_from_json(Obj, "list", list);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -800,21 +781,17 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "access", access);
 | 
								field_from_json(Obj, "access", access);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void ObjectACLList::to_json(Poco::JSON::Object &Obj) const {
 | 
						void ObjectACLList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "list", list); }
 | 
				
			||||||
        field_to_json(Obj, "list", list);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool ObjectACLList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool ObjectACLList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
		try {
 | 
							try {
 | 
				
			||||||
			field_from_json(Obj, "list", list);
 | 
								field_from_json(Obj, "list", list);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -842,7 +819,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			RESTAPI_utils::field_from_json(Obj, "venue", venue);
 | 
								RESTAPI_utils::field_from_json(Obj, "venue", venue);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -856,7 +832,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			RESTAPI_utils::field_from_json(Obj, "serialNumbers", serialNumbers);
 | 
								RESTAPI_utils::field_from_json(Obj, "serialNumbers", serialNumbers);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -870,7 +845,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			RESTAPI_utils::field_from_json(Obj, "list", list);
 | 
								RESTAPI_utils::field_from_json(Obj, "list", list);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -908,7 +882,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "operatorId", operatorId);
 | 
								field_from_json(Obj, "operatorId", operatorId);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -928,7 +901,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "value", value);
 | 
								field_from_json(Obj, "value", value);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -942,7 +914,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "variables", variables);
 | 
								field_from_json(Obj, "variables", variables);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -983,7 +954,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "variableBlocks", variableBlocks);
 | 
								field_from_json(Obj, "variableBlocks", variableBlocks);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1003,7 +973,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "firmwareUpgrade", firmwareUpgrade);
 | 
								field_from_json(Obj, "firmwareUpgrade", firmwareUpgrade);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1051,7 +1020,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "realMacAddress", realMacAddress);
 | 
								field_from_json(Obj, "realMacAddress", realMacAddress);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1065,7 +1033,6 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "subscriberDevices", subscriberDevices);
 | 
								field_from_json(Obj, "subscriberDevices", subscriberDevices);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1085,13 +1052,13 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "devices", devices);
 | 
								field_from_json(Obj, "devices", devices);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
 | 
						bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
 | 
				
			||||||
        uint64_t Now = OpenWifi::Now();
 | 
											  ObjectInfo &I) {
 | 
				
			||||||
 | 
							uint64_t Now = Utils::Now();
 | 
				
			||||||
		if (O->has("name"))
 | 
							if (O->has("name"))
 | 
				
			||||||
			I.name = O->get("name").toString();
 | 
								I.name = O->get("name").toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1105,14 +1072,16 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
		for (auto &i : I.notes) {
 | 
							for (auto &i : I.notes) {
 | 
				
			||||||
			if (i.note.empty())
 | 
								if (i.note.empty())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
            N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note});
 | 
								N.push_back(
 | 
				
			||||||
 | 
									SecurityObjects::NoteInfo{.created = Now, .createdBy = U.email, .note = i.note});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		I.modified = Now;
 | 
							I.modified = Now;
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
 | 
						bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U,
 | 
				
			||||||
        uint64_t Now = OpenWifi::Now();
 | 
											  ObjectInfo &I) {
 | 
				
			||||||
 | 
							uint64_t Now = Utils::Now();
 | 
				
			||||||
		if (O->has("name"))
 | 
							if (O->has("name"))
 | 
				
			||||||
			I.name = O->get("name").toString();
 | 
								I.name = O->get("name").toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1126,18 +1095,19 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
		for (auto &i : I.notes) {
 | 
							for (auto &i : I.notes) {
 | 
				
			||||||
			if (i.note.empty())
 | 
								if (i.note.empty())
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
            N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note});
 | 
								N.push_back(
 | 
				
			||||||
 | 
									SecurityObjects::NoteInfo{.created = Now, .createdBy = U.email, .note = i.note});
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		I.notes = N;
 | 
							I.notes = N;
 | 
				
			||||||
		I.modified = I.created = Now;
 | 
							I.modified = I.created = Now;
 | 
				
			||||||
        I.id = MicroService::CreateUUID();
 | 
							I.id = MicroServiceCreateUUID();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool CreateObjectInfo([[maybe_unused]] const SecurityObjects::UserInfo &U, ObjectInfo &I) {
 | 
						bool CreateObjectInfo([[maybe_unused]] const SecurityObjects::UserInfo &U, ObjectInfo &I) {
 | 
				
			||||||
        I.modified = I.created = OpenWifi::Now();
 | 
							I.modified = I.created = Utils::Now();
 | 
				
			||||||
        I.id = MicroService::CreateUUID();
 | 
							I.id = MicroServiceCreateUUID();
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1154,10 +1124,319 @@ namespace OpenWifi::ProvObjects {
 | 
				
			|||||||
			field_from_json(Obj, "firmwareUpgrade", firmwareUpgrade);
 | 
								field_from_json(Obj, "firmwareUpgrade", firmwareUpgrade);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (...) {
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RRMAlgorithmDetails::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "name", name);
 | 
				
			||||||
 | 
							field_to_json(Obj, "parameters", parameters);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool RRMAlgorithmDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "name", name);
 | 
				
			||||||
 | 
								field_from_json(Obj, "parameters", parameters);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RRMDetails::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "vendor", vendor);
 | 
				
			||||||
 | 
							field_to_json(Obj, "schedule", schedule);
 | 
				
			||||||
 | 
							field_to_json(Obj, "algorithms", algorithms);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool RRMDetails::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "vendor", vendor);
 | 
				
			||||||
 | 
								field_from_json(Obj, "schedule", schedule);
 | 
				
			||||||
 | 
								field_from_json(Obj, "algorithms", algorithms);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ConfigurationOverride::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "source", source);
 | 
				
			||||||
 | 
							field_to_json(Obj, "reason", reason);
 | 
				
			||||||
 | 
							field_to_json(Obj, "parameterName", parameterName);
 | 
				
			||||||
 | 
							field_to_json(Obj, "parameterType", parameterType);
 | 
				
			||||||
 | 
							field_to_json(Obj, "parameterValue", parameterValue);
 | 
				
			||||||
 | 
							field_to_json(Obj, "modified", modified);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ConfigurationOverride::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "source", source);
 | 
				
			||||||
 | 
								field_from_json(Obj, "reason", reason);
 | 
				
			||||||
 | 
								field_from_json(Obj, "parameterName", parameterName);
 | 
				
			||||||
 | 
								field_from_json(Obj, "parameterType", parameterType);
 | 
				
			||||||
 | 
								field_from_json(Obj, "parameterValue", parameterValue);
 | 
				
			||||||
 | 
								field_from_json(Obj, "modified", modified);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void ConfigurationOverrideList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
							field_to_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
 | 
							field_to_json(Obj, "overrides", overrides);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ConfigurationOverrideList::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
								field_from_json(Obj, "managementPolicy", managementPolicy);
 | 
				
			||||||
 | 
								field_from_json(Obj, "overrides", overrides);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void GLBLRAccountInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        info.to_json(Obj);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "privateKey", privateKey);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "country", country);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "province", province);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "city", city);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "organization", organization);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "commonName", commonName);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "CSR", CSR);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "CSRPrivateKey", CSRPrivateKey);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "CSRPublicKey", CSRPublicKey);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool GLBLRAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            info.from_json(Obj);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "privateKey", privateKey);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "country", country);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "province", province);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "city", city);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "organization", organization);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "commonName", commonName);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "CSR", CSR);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "CSRPrivateKey", CSRPrivateKey);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "CSRPublicKey", CSRPublicKey);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "GlobalReachAcctId", GlobalReachAcctId);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void GLBLRCertificateInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "id", id);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "name", name);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "accountId", accountId);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "csr", csr);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "certificateChain", certificateChain);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "certificateId", certificateId);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "expiresAt", expiresAt);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "created", created);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool GLBLRCertificateInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            field_from_json(Obj, "id", id);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "name", name);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "accountId", accountId);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "csr", csr);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "certificateChain", certificateChain);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "certificateId", certificateId);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "expiresAt", expiresAt);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "created", created);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void GooglOrionAccountInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        info.to_json(Obj);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "privateKey", privateKey);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "cacerts", cacerts);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool GooglOrionAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            info.from_json(Obj);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "privateKey", privateKey);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "certificate", certificate);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "cacerts", cacerts);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RADIUSServer::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Hostname", Hostname);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "IP", IP);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Port", Port);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Secret", Secret);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSServer::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Hostname", Hostname);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "IP", IP);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Port", Port);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Secret", Secret);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RADIUSEndPointRadiusType::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Authentication", Authentication);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Accounting", Accounting);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "CoA", CoA);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "AccountingInterval", AccountingInterval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndPointRadiusType::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Authentication", Authentication);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Accounting", Accounting);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "CoA", CoA);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "AccountingInterval", AccountingInterval);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RADIUSEndPointRadsecType::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Hostname", Hostname);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "IP", IP);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Port", Port);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Secret", Secret);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "OpenRoamingType", OpenRoamingType);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Weight", Weight);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Certificate", Certificate);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "PrivateKey", PrivateKey);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "CaCerts", CaCerts);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "AllowSelfSigned", AllowSelfSigned);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndPointRadsecType::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Hostname", Hostname);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "IP", IP);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Port", Port);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Secret", Secret);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "OpenRoamingType", OpenRoamingType);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "UseOpenRoamingAccount", UseOpenRoamingAccount);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Weight", Weight);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Certificate", Certificate);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "PrivateKey", PrivateKey);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "CaCerts", CaCerts);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "AllowSelfSigned", AllowSelfSigned);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RADIUSEndPoint::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        info.to_json(Obj);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Type", Type);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "RadsecServers", RadsecServers);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "RadiusServers", RadiusServers);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "PoolStrategy", PoolStrategy);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "Index", Index);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "UsedBy", UsedBy);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "UseGWProxy", UseGWProxy);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "NasIdentifier", NasIdentifier);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "AccountingInterval", AccountingInterval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndPoint::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            info.from_json(Obj);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Type", Type);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "RadsecServers", RadsecServers);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "RadiusServers", RadiusServers);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "PoolStrategy", PoolStrategy);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "Index", Index);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "UsedBy", UsedBy);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "UseGWProxy", UseGWProxy);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "NasIdentifier", NasIdentifier);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "AccountingInterval", AccountingInterval);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RADIUSEndpointUpdateStatus::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
					        field_to_json(Obj, "lastUpdate", lastUpdate);
 | 
				
			||||||
 | 
					        field_to_json(Obj, "lastConfigurationChange", lastConfigurationChange);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndpointUpdateStatus::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            field_from_json(Obj, "lastUpdate", lastUpdate);
 | 
				
			||||||
 | 
					            field_from_json(Obj, "lastConfigurationChange", lastConfigurationChange);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndpointUpdateStatus::Read() {
 | 
				
			||||||
 | 
					        Poco::File  F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            if (F.exists()) {
 | 
				
			||||||
 | 
					                Poco::JSON::Parser P;
 | 
				
			||||||
 | 
					                std::ifstream ifs(F.path(), std::ios_base::in | std::ios_base::binary);
 | 
				
			||||||
 | 
					                auto Obj = P.parse(ifs);
 | 
				
			||||||
 | 
					                return from_json(Obj.extract<Poco::JSON::Object::Ptr>());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (...) {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndpointUpdateStatus::Save() {
 | 
				
			||||||
 | 
					        Poco::File  F(OpenWifi::MicroServiceDataDirectory()+"/RADIUSEndpointUpdateStatus.json");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Poco::JSON::Object Obj;
 | 
				
			||||||
 | 
					            to_json(Obj);
 | 
				
			||||||
 | 
					            std::ofstream O(F.path(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
 | 
				
			||||||
 | 
					            Poco::JSON::Stringifier::stringify(Obj, O);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } catch (...) {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool RADIUSEndpointUpdateStatus::ChangeConfiguration() {
 | 
				
			||||||
 | 
					        Read();
 | 
				
			||||||
 | 
					        lastConfigurationChange = Utils::Now();
 | 
				
			||||||
 | 
					        return Save();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace OpenWifi::ProvObjects
 | 
				
			||||||
 
 | 
				
			|||||||