Compare commits
	
		
			5 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 07f2b3944e | ||
|   | 7760230f02 | ||
|   | 6223ade0f6 | ||
|   | da52cf5823 | ||
|   | e9a9416332 | 
							
								
								
									
										178
									
								
								.clang-format
									
									
									
									
									
								
							
							
						
						| @@ -1,178 +0,0 @@ | |||||||
| --- |  | ||||||
| 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 |  | ||||||
| ... |  | ||||||
|  |  | ||||||
							
								
								
									
										122
									
								
								BUILDING.md
									
									
									
									
									
								
							
							
						
						| @@ -1,122 +0,0 @@ | |||||||
| # Building from source |  | ||||||
| In order to build the 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/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. |  | ||||||
| ```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/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 |  | ||||||
| ```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/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/). |  | ||||||
| ```bash |  | ||||||
| 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 |  | ||||||
| ``` |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| cmake_minimum_required(VERSION 3.13) | cmake_minimum_required(VERSION 3.13) | ||||||
| project(owfms VERSION 3.0.0) | project(owfms VERSION 2.8.0) | ||||||
|  |  | ||||||
| set(CMAKE_CXX_STANDARD 17) | set(CMAKE_CXX_STANDARD 17) | ||||||
|  |  | ||||||
| @@ -61,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" -DBOOST_NO_CXX98_FUNCTION_BASE=1) | add_definitions(-DPOCO_LOG_DEBUG="1") | ||||||
|  |  | ||||||
| if(ASAN) | if(ASAN) | ||||||
|     add_compile_options(-fsanitize=address) |     add_compile_options(-fsanitize=address) | ||||||
| @@ -117,7 +117,6 @@ add_executable( owfms | |||||||
|         src/framework/RESTAPI_PartHandler.h |         src/framework/RESTAPI_PartHandler.h | ||||||
|         src/framework/MicroService.cpp |         src/framework/MicroService.cpp | ||||||
|         src/framework/MicroServiceExtra.h |         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_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 | ||||||
| @@ -157,7 +156,6 @@ 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
									
									
									
									
									
								
							
							
						
						| @@ -1,250 +0,0 @@ | |||||||
| # 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 |  | ||||||
| ``` |  | ||||||
| @@ -1,38 +0,0 @@ | |||||||
| # 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.  |  | ||||||
							
								
								
									
										49
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						| @@ -1,9 +1,6 @@ | |||||||
| ARG DEBIAN_VERSION=11.5-slim | ARG DEBIAN_VERSION=11.5-slim | ||||||
| ARG POCO_VERSION=poco-tip-v2 | ARG POCO_VERSION=poco-tip-v2 | ||||||
| ARG CPPKAFKA_VERSION=tip-v1 | ARG CPPKAFKA_VERSION=tip-v1 | ||||||
| ARG VALIJASON_VERSION=tip-v1 |  | ||||||
| ARG APP_NAME=owfms |  | ||||||
| ARG APP_HOME_DIR=/openwifi |  | ||||||
|  |  | ||||||
| FROM debian:$DEBIAN_VERSION AS build-base | FROM debian:$DEBIAN_VERSION AS build-base | ||||||
|  |  | ||||||
| @@ -41,17 +38,14 @@ 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 app-build | FROM build-base AS owfms-build | ||||||
|  |  | ||||||
| ARG APP_NAME | ADD CMakeLists.txt build /owfms/ | ||||||
|  | ADD overlays /owfms/overlays | ||||||
| ADD CMakeLists.txt build /${APP_NAME}/ | ADD cmake /owfms/cmake | ||||||
| ADD overlays /${APP_NAME}/overlays | ADD src /owfms/src | ||||||
| ADD cmake /${APP_NAME}/cmake | ADD .git /owfms/.git | ||||||
| ADD src /${APP_NAME}/src |  | ||||||
| ADD .git /${APP_NAME}/.git |  | ||||||
| ARG VCPKG_VERSION=2022.11.14 | ARG VCPKG_VERSION=2022.11.14 | ||||||
|  |  | ||||||
| RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \ | RUN git clone --depth 1 --branch ${VCPKG_VERSION} https://github.com/microsoft/vcpkg && \ | ||||||
|     ./vcpkg/bootstrap-vcpkg.sh && \ |     ./vcpkg/bootstrap-vcpkg.sh && \ | ||||||
|     mkdir /vcpkg/custom-triplets && \ |     mkdir /vcpkg/custom-triplets && \ | ||||||
| @@ -64,28 +58,23 @@ 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 | ||||||
|  |  | ||||||
| WORKDIR /${APP_NAME} | WORKDIR /owfms | ||||||
| RUN mkdir cmake-build | RUN mkdir cmake-build | ||||||
| WORKDIR /${APP_NAME}/cmake-build | WORKDIR /owfms/cmake-build | ||||||
| RUN cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.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 | ||||||
|  |  | ||||||
| ARG APP_NAME | ENV OWFMS_USER=owfms \ | ||||||
| ARG APP_HOME_DIR |     OWFMS_ROOT=/owfms-data \ | ||||||
|  |     OWFMS_CONFIG=/owfms-data | ||||||
|  |  | ||||||
| ENV APP_NAME=$APP_NAME \ | RUN useradd "$OWFMS_USER" | ||||||
|     APP_USER=$APP_NAME \ |  | ||||||
|     APP_ROOT=/$APP_NAME-data \ |  | ||||||
|     APP_CONFIG=/$APP_NAME-data \ |  | ||||||
|     APP_HOME_DIR=$APP_HOME_DIR |  | ||||||
|  |  | ||||||
| RUN useradd $APP_USER | RUN mkdir /openwifi | ||||||
|  | RUN mkdir -p "$OWFMS_ROOT" "$OWFMS_CONFIG" && \ | ||||||
| RUN mkdir $APP_HOME_DIR |     chown "$OWFMS_USER": "$OWFMS_ROOT" "$OWFMS_CONFIG" | ||||||
| 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 \ | ||||||
| @@ -94,14 +83,14 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ | |||||||
| COPY readiness_check /readiness_check | COPY readiness_check /readiness_check | ||||||
| COPY test_scripts/curl/cli /cli | COPY test_scripts/curl/cli /cli | ||||||
|  |  | ||||||
| COPY $APP_NAME.properties.tmpl / | COPY owfms.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=app-build /$APP_NAME/cmake-build/$APP_NAME $APP_HOME_DIR/$APP_NAME | COPY --from=owfms-build /owfms/cmake-build/owfms /openwifi/owfms | ||||||
| COPY --from=app-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/ | COPY --from=owfms-build /vcpkg/installed/x64-linux/lib/ /usr/local/lib/ | ||||||
| COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/ | COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib/ /usr/local/lib/ | ||||||
| COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/ | COPY --from=poco-build /poco/cmake-build/lib/ /usr/local/lib/ | ||||||
|  |  | ||||||
| @@ -110,4 +99,4 @@ RUN ldconfig | |||||||
| EXPOSE 16004 17004 16104 | EXPOSE 16004 17004 16104 | ||||||
|  |  | ||||||
| ENTRYPOINT ["/docker-entrypoint.sh"] | ENTRYPOINT ["/docker-entrypoint.sh"] | ||||||
| CMD ${APP_HOME_DIR}/${APP_NAME} | CMD ["/openwifi/owfms"] | ||||||
|   | |||||||
							
								
								
									
										251
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -1,7 +1,3 @@ | |||||||
| <p align="center"> |  | ||||||
|     <img src="images/project/logo.svg" width="200"/> |  | ||||||
| </p> |  | ||||||
|  |  | ||||||
| # uCentralFMS | # uCentralFMS | ||||||
|  |  | ||||||
| ## What is this? | ## What is this? | ||||||
| @@ -11,85 +7,218 @@ used in your OpenWiFi solution. You may either [build it](#building) or use the | |||||||
|  |  | ||||||
| ## OpenAPI | ## OpenAPI | ||||||
| You may get static page with OpenAPI docs generated from the definition on [GitHub Page](https://telecominfraproject.github.io/wlan-cloud-ucentralfms/). | 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. |  | ||||||
|  | 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 | ||||||
| To build the microservice from source, please follow the instructions in [here](./BUILDING.md) | In order to build the uCentralFMS, 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 | ||||||
|  |  | ||||||
| ## Docker | Building is a 2 part process. The first part is to build a local copy of the framework tailored to your environment. This | ||||||
| To use the CLoudSDK deployment please follow [here](https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy) | 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/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 `uploads` directories. | From the directory where your cloned source is, you will need to create the `certs`, `logs`, and `data`. | ||||||
| ```bash | ```shell | ||||||
| mkdir certs | mkdir certs | ||||||
| mkdir certs/cas |  | ||||||
| mkdir logs | mkdir logs | ||||||
| mkdir uploads | mkdir data | ||||||
| ``` |  | ||||||
| You should now have the following: |  | ||||||
| ```text |  | ||||||
| --+-- certs |  | ||||||
|   |   +--- cas |  | ||||||
|   +-- cmake |  | ||||||
|   +-- cmake-build |  | ||||||
|   +-- logs |  | ||||||
|   +-- src |  | ||||||
|   +-- test_scripts |  | ||||||
|   +-- openapi |  | ||||||
|   +-- uploads |  | ||||||
|   +-- owsec.properties |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ### Certificate | ### Certificates | ||||||
| The OWFMS uses a certificate to provide security for the REST API Certificate to secure the Northbound API. | Love'em of hate'em, we gotta use'em. So we tried to make this as easy as possible for you. | ||||||
|  |  | ||||||
| #### 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. | ||||||
|  |  | ||||||
| ```text | ```asm | ||||||
| certs ---+--- restapi-ca.pem | certs ---+---  | ||||||
|  |          +--- restapi-ca.pem | ||||||
|          +--- restapi-cert.pem |          +--- restapi-cert.pem | ||||||
|          +--- restapi-key.pem |          +--- restapi-key.pem | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ## Firewall Considerations | ### Configuration | ||||||
| | Port  | Description                                   | Configurable | | The configuration is kep in the file `owfms.properties`. This is a text file read by the service at startup time. | ||||||
| |:------|:----------------------------------------------|:------------:| |  | ||||||
| | 16003 | Default port for REST API Access to the OWFMS |     yes      | |  | ||||||
|  |  | ||||||
| ### Environment variables | #### Basic configuration | ||||||
| The following environment variables should be set from the root directory of the service. They tell the OWGW process where to find | You must set the environment variables: | ||||||
| the configuration and the root directory. | - OWFMS_ROOT: represents where the root of the installation is for this service. | ||||||
| ```bash | - OWFMS_CONFIG: represents the path where the configuration is kept. | ||||||
| export OWGW_ROOT=`pwd` |  | ||||||
| export OWGW_CONFIG=`pwd` | #### The file section | ||||||
|  | #### 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 | ||||||
| ``` | ``` | ||||||
| You can run the shell script `set_env.sh` from the microservice root. | Of importance are the `.port` which should point to the port used. | ||||||
|  |  | ||||||
| ### OWFMS Service Configuration | #### Internal microservice interface | ||||||
| The configuration is kept in a file called `owfms.properties`. To understand the content of this file, | ```json | ||||||
| please look [here](https://github.com/Telecominfraproject/wlan-cloud-ucentralfms/blob/main/CONFIGURATION.md) | 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 | ||||||
|  | ``` | ||||||
|  | You can leave all the default values for this one.  | ||||||
|  |  | ||||||
| ## Kafka topics | #### System values | ||||||
| Toe read more about Kafka, follow the [document](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/main/KAFKA.md) | 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  | ||||||
|  | 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. | ||||||
|  |  | ||||||
| ## Contributions | ```json | ||||||
| We need more contributors. Should you wish to contribute, | openwifi.service.key = $OWFMS_ROOT/certs/restapi-key.pem | ||||||
| please follow the [contributions](https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/CONTRIBUTING.md) document. | openwifi.service.key.password = mypassword | ||||||
|  | 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 | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ## Pull Requests | #### S3 configuration | ||||||
| Please create a branch with the Jira addressing the issue you are fixing or the feature you are implementing. | 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.  | ||||||
| Create a pull-request from the branch into master. |  | ||||||
|  |  | ||||||
| ## Additional OWSDK Microservices | ```json | ||||||
| Here is a list of additional OWSDK microservices | s3.bucketname = ucentral-ap-firmware | ||||||
| | Name | Description | Link | OpenAPI | | s3.region = us-east-1 | ||||||
| | :--- | :--- | :---: | :---: | | s3.secret = ******************************************* | ||||||
| | 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.key =  ******************************************* | ||||||
| | 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.retry = 60 | ||||||
| | 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) | | s3.bucket.uri = ucentral-ap-firmware.s3.amazonaws.com | ||||||
| | 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) | |  | ||||||
|  |  | ||||||
|  | ``` | ||||||
|   | |||||||
| @@ -25,9 +25,6 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then | |||||||
|   SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \ |   SECURITY_RESTAPI_DISABLE=${SECURITY_RESTAPI_DISABLE:-"false"} \ | ||||||
|   FIRMWAREDB_REFRESH=${FIRMWAREDB_REFRESH:-"86400"} \ |   FIRMWAREDB_REFRESH=${FIRMWAREDB_REFRESH:-"86400"} \ | ||||||
|   FIRMWAREDB_MAXAGE=${FIRMWAREDB_MAXAGE:-"90"} \ |   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:-"*******************************************"} \ | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ fullnameOverride: "" | |||||||
| images: | images: | ||||||
|   owfms: |   owfms: | ||||||
|     repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms |     repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owfms | ||||||
|     tag: v3.0.0 |     tag: v2.8.0 | ||||||
|     pullPolicy: Always |     pullPolicy: Always | ||||||
| #    regcred: | #    regcred: | ||||||
| #      registry: tip-tip-wlan-cloud-ucentral.jfrog.io | #      registry: tip-tip-wlan-cloud-ucentral.jfrog.io | ||||||
| @@ -143,9 +143,6 @@ 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 | ||||||
|   | |||||||
| Before Width: | Height: | Size: 104 KiB | 
| Before Width: | Height: | Size: 80 KiB | 
| Before Width: | Height: | Size: 80 KiB | 
| Before Width: | Height: | Size: 75 KiB | 
| Before Width: | Height: | Size: 75 KiB | 
| Before Width: | Height: | Size: 218 KiB | 
| Before Width: | Height: | Size: 158 KiB | 
| Before Width: | Height: | Size: 140 KiB | 
| Before Width: | Height: | Size: 121 KiB | 
| Before Width: | Height: | Size: 44 KiB | 
| Before Width: | Height: | Size: 192 KiB | 
| Before Width: | Height: | Size: 197 KiB | 
| Before Width: | Height: | Size: 50 KiB | 
| Before Width: | Height: | Size: 59 KiB | 
| Before Width: | Height: | Size: 59 KiB | 
| Before Width: | Height: | Size: 51 KiB | 
| Before Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 72 KiB | 
| Before Width: | Height: | Size: 34 KiB | 
| Before Width: | Height: | Size: 98 KiB | 
| Before Width: | Height: | Size: 89 KiB | 
| Before Width: | Height: | Size: 89 KiB | 
| Before Width: | Height: | Size: 204 KiB | 
| Before Width: | Height: | Size: 159 KiB | 
| Before Width: | Height: | Size: 159 KiB | 
| Before Width: | Height: | Size: 103 KiB | 
| Before Width: | Height: | Size: 103 KiB | 
| Before Width: | Height: | Size: 103 KiB | 
| Before Width: | Height: | Size: 59 KiB | 
| Before Width: | Height: | Size: 80 KiB | 
| Before Width: | Height: | Size: 80 KiB | 
| Before Width: | Height: | Size: 4.8 KiB | 
| @@ -1,165 +0,0 @@ | |||||||
| <?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> |  | ||||||
| Before Width: | Height: | Size: 8.0 KiB | 
| @@ -251,17 +251,6 @@ 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 | ||||||
| @@ -353,33 +342,6 @@ 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: | ||||||
| @@ -514,11 +476,6 @@ 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 | ||||||
| @@ -526,11 +483,6 @@ 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: | ||||||
| @@ -538,29 +490,6 @@ 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: | ||||||
| @@ -770,19 +699,19 @@ paths: | |||||||
|       operationId: getFirmwareAge |       operationId: getFirmwareAge | ||||||
|       parameters: |       parameters: | ||||||
|         - in: query |         - in: query | ||||||
|           description: The exact current version of the firmware on that device. |           description: The exact current verion 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 version of the firmware on that device. |           description: The exact current verion 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 list of serial  numbers to retrieve age for |           description: Specify lits of serial  numbers to retrive age for | ||||||
|           name: select |           name: select | ||||||
|           schema: |           schema: | ||||||
|             type: string |             type: string | ||||||
| @@ -952,75 +881,16 @@ paths: | |||||||
|             type: string |             type: string | ||||||
|             enum: |             enum: | ||||||
|               - info |               - info | ||||||
|               - extraConfiguration |  | ||||||
|               - resources |  | ||||||
|           required: true |           required: true | ||||||
|       responses: |  | ||||||
|         200: |  | ||||||
|           $ref: '#/components/schemas/SystemCommandResults' |  | ||||||
|         403: |  | ||||||
|           $ref: '#/components/responses/Unauthorized' |  | ||||||
|         404: |  | ||||||
|           $ref: '#/components/responses/NotFound' |  | ||||||
|  |  | ||||||
|   /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: |       responses: | ||||||
|         200: |         200: | ||||||
|           description: List of configuration elements |           description: Successfull command execution | ||||||
|           content: |           content: | ||||||
|             application/json: |             application/json: | ||||||
|               schema: |               schema: | ||||||
|                 type: array |                 oneOf: | ||||||
|                 items: |                   - $ref: '#/components/schemas/SystemInfoResults' | ||||||
|                   $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: | ||||||
|   | |||||||
| @@ -43,8 +43,6 @@ 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 = ******************************************* | ||||||
|   | |||||||
| @@ -44,9 +44,6 @@ 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,9 +3,9 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #include "AutoUpdater.h" | #include "AutoUpdater.h" | ||||||
| #include "LatestFirmwareCache.h" |  | ||||||
| #include "SDK/GW_SDK.h" |  | ||||||
| #include "SDK/Prov_SDK.h" | #include "SDK/Prov_SDK.h" | ||||||
|  | #include "SDK/GW_SDK.h" | ||||||
|  | #include "LatestFirmwareCache.h" | ||||||
| #include "StorageService.h" | #include "StorageService.h" | ||||||
|  |  | ||||||
| #include "framework/MicroServiceFuncs.h" | #include "framework/MicroServiceFuncs.h" | ||||||
| @@ -21,8 +21,7 @@ namespace OpenWifi { | |||||||
|         if(AutoUpdaterEnabled_) { |         if(AutoUpdaterEnabled_) { | ||||||
|             Running_ = false; |             Running_ = false; | ||||||
|             AutoUpdaterFrequency_ = MicroServiceConfigGetInt("autoupdater.frequency",600); |             AutoUpdaterFrequency_ = MicroServiceConfigGetInt("autoupdater.frequency",600); | ||||||
| 			AutoUpdaterCallBack_ = |             AutoUpdaterCallBack_ = std::make_unique<Poco::TimerCallback<AutoUpdater>>(*this, &AutoUpdater::onTimer); | ||||||
| 				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_); | ||||||
| @@ -63,27 +62,22 @@ namespace OpenWifi { | |||||||
|                     SerialCache     C; |                     SerialCache     C; | ||||||
|                     C.LastCheck = now; |                     C.LastCheck = now; | ||||||
|                     bool        firmwareRCOnly; |                     bool        firmwareRCOnly; | ||||||
| 					if (OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, |                     if(OpenWifi::SDK::Prov::GetFirmwareOptions(Entry.first, firmwareUpgrade, firmwareRCOnly)) { | ||||||
| 																firmwareRCOnly)) { |                         poco_debug(Logger(),fmt::format("Found firmware options for {}",Entry.first)); | ||||||
| 						poco_debug(Logger(), |  | ||||||
| 								   fmt::format("Found firmware options for {}", Entry.first)); |  | ||||||
|                         C.firmwareRCOnly = firmwareRCOnly; |                         C.firmwareRCOnly = firmwareRCOnly; | ||||||
|                         C.firmwareUpgrade = firmwareUpgrade; |                         C.firmwareUpgrade = firmwareUpgrade; | ||||||
|                     } else { |                     } else { | ||||||
| 						poco_debug(Logger(), |                         poco_debug(Logger(),fmt::format("Found no firmware options for {}",Entry.first)); | ||||||
| 								   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( |                     poco_information(Logger(),fmt::format("Device {} not upgradable. Provisioning service settings.",Entry.first)); | ||||||
| 						Logger(), |  | ||||||
| 						fmt::format("Device {} not upgradable. Provisioning service settings.", |  | ||||||
| 									Entry.first)); |  | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -93,31 +87,20 @@ 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 {}", |                         poco_information(Logger(),fmt::format("Upgrading {} to version {}", Entry.first, fwEntry.Revision)); | ||||||
| 															   Entry.first, fwEntry.Revision)); |                         if(OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first,fwDetails.uri)) { | ||||||
| 						if (OpenWifi::SDK::GW::SendFirmwareUpgradeCommand(Entry.first, |                             poco_information(Logger(),fmt::format("Upgrade command sent for {}",Entry.first)); | ||||||
| 																		  fwDetails.uri)) { |  | ||||||
| 							poco_information( |  | ||||||
| 								Logger(), fmt::format("Upgrade command sent for {}", Entry.first)); |  | ||||||
|                         } else { |                         } else { | ||||||
| 							poco_information( |                             poco_information(Logger(),fmt::format("Upgrade command not sent for {}",Entry.first)); | ||||||
| 								Logger(), |  | ||||||
| 								fmt::format("Upgrade command not sent for {}", Entry.first)); |  | ||||||
|                         } |                         } | ||||||
|                     } else { |                     } else { | ||||||
| 						poco_information(Logger(), |                         poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second )); | ||||||
| 										 fmt::format("Firmware for device {} ({}) cannot be found.", |  | ||||||
| 													 Entry.first, Entry.second)); |  | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
| 					poco_information(Logger(), |                     poco_information(Logger(),fmt::format("Firmware for device {} ({}) cannot be found.", Entry.first, Entry.second )); | ||||||
| 									 fmt::format("Firmware for device {} ({}) cannot be found.", |  | ||||||
| 												 Entry.first, Entry.second)); |  | ||||||
|                 } |                 } | ||||||
|             } catch (...) { |             } catch (...) { | ||||||
| 				poco_information( |                 poco_information(Logger(),fmt::format("Exception during auto update for device {}.", Entry.first )); | ||||||
| 					Logger(), |  | ||||||
| 					fmt::format("Exception during auto update for device {}.", Entry.first)); |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -126,4 +109,4 @@ namespace OpenWifi { | |||||||
|         poco_information(Logger(),"Reinitializing."); |         poco_information(Logger(),"Reinitializing."); | ||||||
|         Reset(); |         Reset(); | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi | } | ||||||
| @@ -6,14 +6,15 @@ | |||||||
|  |  | ||||||
| #include <deque> | #include <deque> | ||||||
|  |  | ||||||
| #include "Poco/Timer.h" |  | ||||||
| #include "Poco/Util/Application.h" |  | ||||||
| #include "framework/SubSystemServer.h" | #include "framework/SubSystemServer.h" | ||||||
|  | #include "Poco/Util/Application.h" | ||||||
|  | #include "Poco/Timer.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class AutoUpdater : public SubSystemServer { // };, Poco::Runnable { |     class AutoUpdater : public SubSystemServer { // };, Poco::Runnable { | ||||||
|     public: |     public: | ||||||
|  |  | ||||||
|     struct SerialCache { |     struct SerialCache { | ||||||
|             uint64_t        LastCheck=0; |             uint64_t        LastCheck=0; | ||||||
|             std::string     firmwareUpgrade; |             std::string     firmwareUpgrade; | ||||||
| @@ -45,9 +46,12 @@ 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 | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,21 +3,21 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #include <aws/core/Aws.h> | #include <aws/core/Aws.h> | ||||||
| #include <aws/s3/model/AccessControlPolicy.h> |  | ||||||
| #include <aws/s3/model/CreateBucketRequest.h> | #include <aws/s3/model/CreateBucketRequest.h> | ||||||
| #include <aws/s3/model/GetBucketAclRequest.h> |  | ||||||
| #include <aws/s3/model/PutBucketAclRequest.h> |  | ||||||
| #include <aws/s3/model/PutObjectRequest.h> | #include <aws/s3/model/PutObjectRequest.h> | ||||||
|  | #include <aws/s3/model/AccessControlPolicy.h> | ||||||
|  | #include <aws/s3/model/PutBucketAclRequest.h> | ||||||
|  | #include <aws/s3/model/GetBucketAclRequest.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 "LatestFirmwareCache.h" | #include "AutoUpdater.h" | ||||||
| #include "ManifestCreator.h" |  | ||||||
| #include "NewCommandHandler.h" | #include "NewCommandHandler.h" | ||||||
| #include "NewConnectionHandler.h" |  | ||||||
| #include "StorageService.h" |  | ||||||
|  |  | ||||||
| #include "framework/UI_WebSocketClientServer.h" | #include "framework/UI_WebSocketClientServer.h" | ||||||
|  |  | ||||||
| @@ -26,23 +26,34 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|     class Daemon *Daemon::instance() { |     class Daemon *Daemon::instance() { | ||||||
|         if (instance_ == nullptr) { |         if (instance_ == nullptr) { | ||||||
| 			instance_ = new Daemon( |             instance_ = new Daemon(vDAEMON_PROPERTIES_FILENAME, | ||||||
| 				vDAEMON_PROPERTIES_FILENAME, vDAEMON_ROOT_ENV_VAR, vDAEMON_CONFIG_ENV_VAR, |                                    vDAEMON_ROOT_ENV_VAR, | ||||||
| 				vDAEMON_APP_NAME, vDAEMON_BUS_TIMER, |                                    vDAEMON_CONFIG_ENV_VAR, | ||||||
| 				SubSystemVec{StorageService(), FirmwareCache(), LatestFirmwareCache(), |                                    vDAEMON_APP_NAME, | ||||||
| 							 DeviceCache(), NewConnectionHandler(), ManifestCreator(), |                                    vDAEMON_BUS_TIMER, | ||||||
| 							 AutoUpdater(), NewCommandHandler(), UI_WebSocketClientServer()}); |                                    SubSystemVec{ | ||||||
|  |                                             StorageService(), | ||||||
|  |                                             FirmwareCache(), | ||||||
|  |                                             LatestFirmwareCache(), | ||||||
|  |                                             DeviceCache(), | ||||||
|  |                                             NewConnectionHandler(), | ||||||
|  |                                             ManifestCreator(), | ||||||
|  |                                             AutoUpdater(), | ||||||
|  |                                             NewCommandHandler(), | ||||||
|  |                                             UI_WebSocketClientServer() | ||||||
|  |                                    }); | ||||||
|         } |         } | ||||||
|         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) { |     void DaemonPostInitialization(Poco::Util::Application &self) { | ||||||
|         Daemon()->PostInitialization(self); |         Daemon()->PostInitialization(self); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi | } | ||||||
|  |  | ||||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||||
|     SSL_library_init(); |     SSL_library_init(); | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/Daemon.h
									
									
									
									
									
								
							
							
						
						| @@ -6,11 +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 "framework/MicroServiceNames.h" | ||||||
|  |  | ||||||
| #include "Dashboard.h" |  | ||||||
| #include "RESTObjects/RESTAPI_FMSObjects.h" | #include "RESTObjects/RESTAPI_FMSObjects.h" | ||||||
|  | #include "Dashboard.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
| @@ -22,10 +22,13 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|     class Daemon : public MicroService { |     class Daemon : public MicroService { | ||||||
|     public: |     public: | ||||||
| 		explicit Daemon(const std::string &PropFile, const std::string &RootEnv, |         explicit Daemon(const std::string & PropFile, | ||||||
| 						const std::string &ConfigEnv, const std::string &AppName, uint64_t BusTimer, |                         const std::string & RootEnv, | ||||||
| 						const SubSystemVec &SubSystems) |                         const std::string & ConfigEnv, | ||||||
| 			: MicroService(PropFile, RootEnv, ConfigEnv, AppName, BusTimer, SubSystems){}; |                         const std::string & AppName, | ||||||
|  |                         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(); | ||||||
| @@ -37,6 +40,6 @@ namespace OpenWifi { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline Daemon * Daemon() { return Daemon::instance(); } |     inline Daemon * Daemon() { return Daemon::instance(); } | ||||||
| } // namespace OpenWifi | } | ||||||
|  |  | ||||||
| #endif //UCENTRALFWS_DAEMON_H | #endif //UCENTRALFWS_DAEMON_H | ||||||
|   | |||||||
| @@ -42,9 +42,10 @@ namespace OpenWifi { | |||||||
|                 DB_ = NewData; |                 DB_ = NewData; | ||||||
|                 ValidDashboard_=true; |                 ValidDashboard_=true; | ||||||
|             } catch(...) { |             } catch(...) { | ||||||
|  |  | ||||||
|             } |             } | ||||||
|             GeneratingDashboard_ = false; |             GeneratingDashboard_ = false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi | } | ||||||
|   | |||||||
| @@ -6,9 +6,9 @@ | |||||||
|  |  | ||||||
| #include <mutex> | #include <mutex> | ||||||
|  |  | ||||||
| #include "Poco/Logger.h" |  | ||||||
| #include "RESTObjects/RESTAPI_FMSObjects.h" |  | ||||||
| #include "framework/OpenWifiTypes.h" | #include "framework/OpenWifiTypes.h" | ||||||
|  | #include "RESTObjects/RESTAPI_FMSObjects.h" | ||||||
|  | #include "Poco/Logger.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|     class DeviceDashboard { |     class DeviceDashboard { | ||||||
| @@ -24,4 +24,4 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|         void Generate(FMSObjects::DeviceReport &D, Poco::Logger &Logger); |         void Generate(FMSObjects::DeviceReport &D, Poco::Logger &Logger); | ||||||
|     }; |     }; | ||||||
| } // namespace OpenWifi | } | ||||||
|   | |||||||
| @@ -16,14 +16,17 @@ namespace OpenWifi { | |||||||
|         poco_information(Logger(),"Stopped..."); |         poco_information(Logger(),"Stopped..."); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void DeviceCache::AddToCache(const std::string &SerialNumber, const std::string &DeviceType, |     void DeviceCache::AddToCache( | ||||||
|  |                         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] = |             DeviceCache_[SerialNumber]=DeviceCacheEntry{ | ||||||
| 				DeviceCacheEntry{.deviceType = DeviceType, .host = Host, .revision = Revision}; |                                                 .deviceType=DeviceType, | ||||||
|  |                                                 .host=Host, | ||||||
|  |                                                 .revision=Revision}; | ||||||
|         } else { |         } else { | ||||||
|             Device->second.revision=Revision; |             Device->second.revision=Revision; | ||||||
|             Device->second.host=Host; |             Device->second.host=Host; | ||||||
| @@ -40,5 +43,8 @@ namespace OpenWifi { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void DeviceCache::DumpCache() {} |  | ||||||
| } // namespace OpenWifi |     void DeviceCache::DumpCache() { | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -4,8 +4,8 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "framework/SubSystemServer.h" |  | ||||||
| #include <string> | #include <string> | ||||||
|  | #include "framework/SubSystemServer.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
| @@ -33,9 +33,12 @@ 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 | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,15 +16,12 @@ namespace OpenWifi { | |||||||
|         poco_information(Logger(),"Stopped..."); |         poco_information(Logger(),"Stopped..."); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	std::shared_ptr<FMSObjects::Firmware> |     std::shared_ptr<FMSObjects::Firmware> GetFirmware([[maybe_unused]] const std::string & DeviceType, [[maybe_unused]] const std::string & Revision) { | ||||||
| 	GetFirmware([[maybe_unused]] const std::string &DeviceType, |  | ||||||
| 				[[maybe_unused]] const std::string &Revision) { |  | ||||||
|         return nullptr; |         return nullptr; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	std::shared_ptr<FMSObjects::Firmware> |     std::shared_ptr<FMSObjects::Firmware> AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) { | ||||||
| 	AddFirmware([[maybe_unused]] const FMSObjects::Firmware &F) { |  | ||||||
|         return nullptr; |         return nullptr; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi | } | ||||||
|   | |||||||
| @@ -24,17 +24,18 @@ namespace OpenWifi { | |||||||
|         int Start() override; |         int Start() override; | ||||||
|         void Stop() override; |         void Stop() override; | ||||||
|  |  | ||||||
| 		std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string &DeviceType, |         std::shared_ptr<FMSObjects::Firmware> GetFirmware(const std::string & DeviceType, const std::string & Revision); | ||||||
| 														  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 | } | ||||||
|   | |||||||
| @@ -18,8 +18,7 @@ namespace OpenWifi { | |||||||
|         poco_information(Logger(),"Stopped..."); |         poco_information(Logger(),"Stopped..."); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	bool LatestFirmwareCache::AddToCache(const std::string &DeviceType, const std::string &Revision, |     bool LatestFirmwareCache::AddToCache(const std::string & DeviceType, const std::string &Revision, const std::string &Id, uint64_t TimeStamp) { | ||||||
| 										 const std::string &Id, uint64_t TimeStamp) { |  | ||||||
|         std::lock_guard G(Mutex_); |         std::lock_guard G(Mutex_); | ||||||
|  |  | ||||||
|         RevisionSet_.insert(Revision); |         RevisionSet_.insert(Revision); | ||||||
| @@ -27,8 +26,10 @@ 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] = |             Cache_[DeviceType] = LatestFirmwareCacheEntry{ | ||||||
| 				LatestFirmwareCacheEntry{.Id = Id, .TimeStamp = TimeStamp, .Revision = Revision}; |                 .Id=Id, | ||||||
|  |                 .TimeStamp=TimeStamp, | ||||||
|  |                 .Revision=Revision}; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if(!IsRC(Revision)) |         if(!IsRC(Revision)) | ||||||
| @@ -36,14 +37,15 @@ 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] = |             rcCache_[DeviceType] = LatestFirmwareCacheEntry{ | ||||||
| 				LatestFirmwareCacheEntry{.Id = Id, .TimeStamp = TimeStamp, .Revision = Revision}; |                 .Id=Id, | ||||||
|  |                 .TimeStamp=TimeStamp, | ||||||
|  |                 .Revision=Revision}; | ||||||
|         } |         } | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, |     bool LatestFirmwareCache::FindLatestFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry )  { | ||||||
| 												 LatestFirmwareCacheEntry &Entry) { |  | ||||||
|         std::lock_guard G(Mutex_); |         std::lock_guard G(Mutex_); | ||||||
|  |  | ||||||
|         auto E=Cache_.find(DeviceType); |         auto E=Cache_.find(DeviceType); | ||||||
| @@ -54,8 +56,7 @@ namespace OpenWifi { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, |     bool LatestFirmwareCache::FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ) { | ||||||
| 													   LatestFirmwareCacheEntry &Entry) { |  | ||||||
|         std::lock_guard G(Mutex_); |         std::lock_guard G(Mutex_); | ||||||
|  |  | ||||||
|         auto E=rcCache_.find(DeviceType); |         auto E=rcCache_.find(DeviceType); | ||||||
| @@ -66,6 +67,7 @@ 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_); | ||||||
|  |  | ||||||
| @@ -76,8 +78,7 @@ namespace OpenWifi { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, |     bool LatestFirmwareCache::IsLatestRCOnly(const std::string &DeviceType, const std::string &Revision) { | ||||||
| 											 const std::string &Revision) { |  | ||||||
|         std::lock_guard G(Mutex_); |         std::lock_guard G(Mutex_); | ||||||
|  |  | ||||||
|         auto E=rcCache_.find(DeviceType); |         auto E=rcCache_.find(DeviceType); | ||||||
| @@ -87,11 +88,13 @@ 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 |  | ||||||
| @@ -5,9 +5,9 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #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 "Poco/StringTokenizer.h" | ||||||
|  |  | ||||||
| @@ -33,12 +33,10 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|         int Start() override; |         int Start() override; | ||||||
|         void Stop() override; |         void Stop() override; | ||||||
| 		bool AddToCache(const std::string &DeviceType, const std::string &Revision, |         bool AddToCache(const std::string & DeviceType, const std::string & Revision, const std::string &Id, uint64_t TimeStamp); | ||||||
| 						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, |         bool FindLatestRCOnlyFirmware(const std::string &DeviceType, LatestFirmwareCacheEntry &Entry ); | ||||||
| 									  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 | ||||||
| @@ -49,14 +47,8 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         void DumpCache(); |         void DumpCache(); | ||||||
| 		inline Types::StringSet GetRevisions() { |         inline Types::StringSet GetRevisions() { std::lock_guard G(Mutex_); return RevisionSet_; }; | ||||||
| 			std::lock_guard G(Mutex_); |         inline Types::StringSet GetDevices() { std::lock_guard G(Mutex_); return DeviceSet_; }; | ||||||
| 			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); | ||||||
|  |  | ||||||
| @@ -65,10 +57,11 @@ 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", |                 SubSystemServer("LatestFirmwareCache", "LATEST-FIRMWARE-CACHE", "LatestFirmwareCache") | ||||||
| 							  "LatestFirmwareCache") {} |         { | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); } |     inline auto LatestFirmwareCache() { return LatestFirmwareCache::instance(); } | ||||||
| } // namespace OpenWifi | } | ||||||
|   | |||||||
| @@ -6,61 +6,45 @@ | |||||||
| #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" | #include "framework/utils.h" | ||||||
|  | #include "fmt/format.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.", |         poco_information(Logger(),fmt::format("Found {} firmware entries in S3 repository.", BucketList.size())); | ||||||
| 											   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 = Utils::Now() - MaxAge_, Rejected = 0, Accepted = 0, BadFormat = 0, |         uint64_t Limit = Utils::Now() - MaxAge_, Rejected=0, Accepted=0, BadFormat=0, MissingJson=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 = |                 auto ParsedContent = P.parse(Entry.S3ContentManifest).extract<Poco::JSON::Object::Ptr>(); | ||||||
| 					P.parse(Entry.S3ContentManifest).extract<Poco::JSON::Object::Ptr>(); |  | ||||||
|  |  | ||||||
| 				if (ParsedContent->has("image") && ParsedContent->has("compatible") && |                 if( ParsedContent->has("image") && | ||||||
| 					ParsedContent->has("revision") && ParsedContent->has("timestamp")) { |                     ParsedContent->has("compatible") && | ||||||
|  |                     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(); | ||||||
| @@ -68,11 +52,7 @@ namespace OpenWifi { | |||||||
|                         Entry.Image = ParsedContent->get("image").toString(); |                         Entry.Image = ParsedContent->get("image").toString(); | ||||||
|                         auto FullNme = Name + "-upgrade.bin"; |                         auto FullNme = Name + "-upgrade.bin"; | ||||||
|                         if(FullNme!=Entry.Image) { |                         if(FullNme!=Entry.Image) { | ||||||
| 							poco_error( |                             poco_error(Logger(),fmt::format("MANIFEST({}): Image name does not match manifest name ({}).",Name,Entry.Image)); | ||||||
| 								Logger(), |  | ||||||
| 								fmt::format( |  | ||||||
| 									"MANIFEST({}): Image name does not match manifest name ({}).", |  | ||||||
| 									Name, Entry.Image)); |  | ||||||
|                             Entry.Valid = false; |                             Entry.Valid = false; | ||||||
|                             BadFormat++; |                             BadFormat++; | ||||||
|                             continue; |                             continue; | ||||||
| @@ -84,10 +64,7 @@ namespace OpenWifi { | |||||||
|                         Entry.Valid = false; |                         Entry.Valid = false; | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
| 					poco_error( |                     poco_error(Logger(),fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.",Name)); | ||||||
| 						Logger(), |  | ||||||
| 						fmt::format("MANIFEST({}): Entry does not have a valid JSON manifest.", |  | ||||||
| 									Name)); |  | ||||||
|                     MissingJson++; |                     MissingJson++; | ||||||
|                     Entry.Valid = false; |                     Entry.Valid = false; | ||||||
|                 } |                 } | ||||||
| @@ -106,27 +83,15 @@ 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; | ||||||
|  |  | ||||||
| 			if (BucketEntry.Valid && |             // skip staging releases. | ||||||
| 				!StorageService()->FirmwaresDB().GetFirmwareByName(R, BucketEntry.Compatible, F)) { |             if(BucketEntry.URI.find("-staging-")!=std::string::npos) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             if(BucketEntry.Valid && !StorageService()->FirmwaresDB().GetFirmwareByName(R,BucketEntry.Compatible,F)) { | ||||||
|                 F.id = MicroServiceCreateUUID(); |                 F.id = MicroServiceCreateUUID(); | ||||||
|                 F.release = Release; |                 F.release = Release; | ||||||
|                 F.size = BucketEntry.S3Size; |                 F.size = BucketEntry.S3Size; | ||||||
| @@ -137,8 +102,7 @@ namespace OpenWifi { | |||||||
|                 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(), |                     poco_information(Logger(),fmt::format("Adding firmware '{}', size={}",Release,F.size)); | ||||||
| 									 fmt::format("Adding firmware '{}', size={}", Release, F.size)); |  | ||||||
|                 } else { |                 } else { | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -148,35 +112,25 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|     int ManifestCreator::Start() { |     int ManifestCreator::Start() { | ||||||
|         Running_ = true; |         Running_ = true; | ||||||
| 		S3EndpointOverride_ = MicroServiceConfigGetString("s3.endpointOverride", ""); |  | ||||||
| 		S3EndpointHttps_ = MicroServiceConfigGetBool("s3.endpoint.https", true); |  | ||||||
| 		S3UseVirtualAdressing_  = MicroServiceConfigGetBool("s3.useVirtualAdressing", true); |  | ||||||
|         S3BucketName_ = MicroServiceConfigGetString("s3.bucketname",""); |         S3BucketName_ = MicroServiceConfigGetString("s3.bucketname",""); | ||||||
|         S3Region_ = MicroServiceConfigGetString("s3.region",""); |         S3Region_ = MicroServiceConfigGetString("s3.region",""); | ||||||
|         S3Secret_ = MicroServiceConfigGetString("s3.secret",""); |         S3Secret_ = MicroServiceConfigGetString("s3.secret",""); | ||||||
|         S3Key_ = MicroServiceConfigGetString("s3.key",""); |         S3Key_ = MicroServiceConfigGetString("s3.key",""); | ||||||
|         S3Retry_ = MicroServiceConfigGetInt("s3.retry",60); |         S3Retry_ = MicroServiceConfigGetInt("s3.retry",60); | ||||||
|  |  | ||||||
| 		DBRefresh_ = MicroServiceConfigGetInt("firmwaredb.refresh", 24 * 60 * 60); |         DBRefresh_ = MicroServiceConfigGetInt("firmwaredb.refresh",30*60); | ||||||
|         MaxAge_ = MicroServiceConfigGetInt("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>>( |         ManifestCreatorCallBack_ = std::make_unique<Poco::TimerCallback<ManifestCreator>>(*this, &ManifestCreator::onTimer); | ||||||
| 			*this, &ManifestCreator::onTimer); |         Timer_.setStartInterval(1 * 60 * 1000);  // first run in 1 minutes | ||||||
| 		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_); | ||||||
|  |  | ||||||
| @@ -190,10 +144,10 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void ManifestCreator::CloseBucket() {} |     void ManifestCreator::CloseBucket() { | ||||||
|  |     } | ||||||
|  |  | ||||||
| 	bool ManifestCreator::GetBucketObjectContent(Aws::S3::S3Client &S3Client, |     bool ManifestCreator::GetBucketObjectContent(Aws::S3::S3Client &S3Client, const std::string &ObjectName, | ||||||
| 												 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()); | ||||||
| @@ -201,7 +155,8 @@ 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); | ||||||
| @@ -223,7 +178,7 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|         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::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, S3UseVirtualAdressing_); |         Aws::S3::S3Client S3Client(AwsCreds_,AwsConfig_); | ||||||
|         Request.SetMaxKeys(100); |         Request.SetMaxKeys(100); | ||||||
|         Aws::S3::Model::ListObjectsV2Outcome Outcome; |         Aws::S3::Model::ListObjectsV2Outcome Outcome; | ||||||
|  |  | ||||||
| @@ -255,8 +210,10 @@ 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") && ParsedContent->has("compatible") && |                         if (ParsedContent->has("image") && | ||||||
| 							ParsedContent->has("revision") && ParsedContent->has("timestamp")) { |                             ParsedContent->has("compatible") && | ||||||
|  |                             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(); | ||||||
| @@ -270,7 +227,8 @@ namespace OpenWifi { | |||||||
|                                 It->second.Image = Image; |                                 It->second.Image = Image; | ||||||
|                                 It->second.S3ContentManifest = Content; |                                 It->second.S3ContentManifest = Content; | ||||||
|                             } else { |                             } else { | ||||||
| 								Bucket.emplace(Release, S3BucketEntry{.Valid = false, |                                       Bucket.emplace(Release, S3BucketEntry{ | ||||||
|  |                                         .Valid = false, | ||||||
|                                         .S3Name = "", |                                         .S3Name = "", | ||||||
|                                         .S3ContentManifest = Content, |                                         .S3ContentManifest = Content, | ||||||
|                                         .S3TimeStamp = 0 , |                                         .S3TimeStamp = 0 , | ||||||
| @@ -285,8 +243,7 @@ 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 = |                     const auto &ReleaseName = FileName.getBaseName().substr(0, FileName.getBaseName().size() - 8); | ||||||
| 						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(); | ||||||
| @@ -298,7 +255,8 @@ namespace OpenWifi { | |||||||
|                         It->second.URI = URI; |                         It->second.URI = URI; | ||||||
|                     } else { |                     } else { | ||||||
|  |  | ||||||
| 						Bucket.emplace(ReleaseName, S3BucketEntry{.Valid = false, |                         Bucket.emplace(ReleaseName, S3BucketEntry{ | ||||||
|  |                                 .Valid = false, | ||||||
|                                 .S3Name = "", |                                 .S3Name = "", | ||||||
|                                 .S3ContentManifest = "", |                                 .S3ContentManifest = "", | ||||||
|                                 .S3TimeStamp = S3TimeStamp, |                                 .S3TimeStamp = S3TimeStamp, | ||||||
| @@ -326,8 +284,7 @@ namespace OpenWifi { | |||||||
|  |  | ||||||
|         // std::cout << "Count:" << Count << "  Runs:" << Runs << std::endl; |         // std::cout << "Count:" << Count << "  Runs:" << Runs << std::endl; | ||||||
|         if(!Outcome.IsSuccess()) { |         if(!Outcome.IsSuccess()) { | ||||||
| 			poco_error(Logger(), fmt::format("Run({},{}) Error while doing ListObjectsV2: {}, {}", |             poco_error(Logger(),fmt::format("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; | ||||||
| @@ -347,6 +304,7 @@ 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 { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -357,4 +315,4 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi | } | ||||||
|   | |||||||
| @@ -5,11 +5,11 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <aws/core/Aws.h> | #include <aws/core/Aws.h> | ||||||
| #include <aws/core/auth/AWSCredentials.h> |  | ||||||
| #include <aws/s3/S3Client.h> | #include <aws/s3/S3Client.h> | ||||||
|  | #include <aws/core/auth/AWSCredentials.h> | ||||||
|  |  | ||||||
| #include "Poco/Timer.h" |  | ||||||
| #include "framework/SubSystemServer.h" | #include "framework/SubSystemServer.h" | ||||||
|  | #include "Poco/Timer.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
| @@ -28,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, Poco::Runnable { |     class ManifestCreator : public SubSystemServer { | ||||||
|     public: |     public: | ||||||
|         static auto instance() { |         static auto instance() { | ||||||
|             static auto instance_ = new ManifestCreator; |             static auto instance_ = new ManifestCreator; | ||||||
| @@ -42,21 +42,14 @@ 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, |         bool GetBucketObjectContent(Aws::S3::S3Client &S3Client, const std::string &ObjectName, std::string & ObjectContent); | ||||||
| 									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_; | ||||||
| @@ -68,14 +61,12 @@ 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 | } | ||||||
|   | |||||||
| @@ -5,8 +5,8 @@ | |||||||
| #include "NewCommandHandler.h" | #include "NewCommandHandler.h" | ||||||
| #include "StorageService.h" | #include "StorageService.h" | ||||||
|  |  | ||||||
| #include "fmt/format.h" |  | ||||||
| #include "framework/KafkaManager.h" | #include "framework/KafkaManager.h" | ||||||
|  | #include "fmt/format.h" | ||||||
| #include "nlohmann/json.hpp" | #include "nlohmann/json.hpp" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
| @@ -50,15 +50,9 @@ 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( |                                     poco_debug(Logger(),fmt::format("Removing device '{}' from upgrade history.",SerialNumber)); | ||||||
| 										Logger(), |  | ||||||
| 										fmt::format("Removing device '{}' from upgrade history.", |  | ||||||
| 													SerialNumber)); |  | ||||||
|                                     StorageService()->HistoryDB().DeleteHistory(SerialNumber); |                                     StorageService()->HistoryDB().DeleteHistory(SerialNumber); | ||||||
| 									poco_debug( |                                     poco_debug(Logger(),fmt::format("Removing device '{}' from device table.",SerialNumber)); | ||||||
| 										Logger(), |  | ||||||
| 										fmt::format("Removing device '{}' from device table.", |  | ||||||
| 													SerialNumber)); |  | ||||||
|                                     StorageService()->DevicesDB().DeleteDevice(SerialNumber); |                                     StorageService()->DevicesDB().DeleteDevice(SerialNumber); | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
| @@ -72,9 +66,7 @@ namespace OpenWifi { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     int NewCommandHandler::Start() { |     int NewCommandHandler::Start() { | ||||||
| 		Types::TopicNotifyFunction F = [this](std::string s1, std::string s2) { |         Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->CommandReceived(s1,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; | ||||||
| @@ -96,4 +88,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 | } | ||||||
| @@ -4,8 +4,8 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "framework/OpenWifiTypes.h" |  | ||||||
| #include "framework/SubSystemServer.h" | #include "framework/SubSystemServer.h" | ||||||
|  | #include "framework/OpenWifiTypes.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
| @@ -28,9 +28,11 @@ 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 | } | ||||||
|   | |||||||
| @@ -3,29 +3,25 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #include "NewConnectionHandler.h" | #include "NewConnectionHandler.h" | ||||||
| #include "AutoUpdater.h" |  | ||||||
| #include "DeviceCache.h" |  | ||||||
| #include "LatestFirmwareCache.h" |  | ||||||
| #include "Poco/JSON/Object.h" |  | ||||||
| #include "Poco/JSON/Parser.h" |  | ||||||
| #include "StorageService.h" |  | ||||||
| #include "framework/KafkaTopics.h" | #include "framework/KafkaTopics.h" | ||||||
| #include "framework/OpenWifiTypes.h" | #include "framework/OpenWifiTypes.h" | ||||||
| #include "framework/ow_constants.h" | #include "framework/ow_constants.h" | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  | #include "Poco/JSON/Parser.h" | ||||||
|  | #include "StorageService.h" | ||||||
|  | #include "LatestFirmwareCache.h" | ||||||
|  | #include "DeviceCache.h" | ||||||
|  | #include "AutoUpdater.h" | ||||||
|  |  | ||||||
| #include "fmt/format.h" |  | ||||||
| #include "framework/KafkaManager.h" | #include "framework/KafkaManager.h" | ||||||
|  | #include "fmt/format.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
| { "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } , | { "system" : { "id" : 6715803232063 , "host" : "https://localhost:17002" } , | ||||||
|  "payload" : "{"capabilities":{"compatible":"linksys_ea8300","model":"Linksys EA8300 |  "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}} | ||||||
| (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() { | ||||||
| @@ -67,54 +63,33 @@ 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 = |                                 auto DeviceType = CapObj->get(uCentralProtocol::COMPATIBLE).toString(); | ||||||
| 									CapObj->get(uCentralProtocol::COMPATIBLE).toString(); |  | ||||||
|                                 auto Serial = PayloadObj->get(uCentralProtocol::SERIAL).toString(); |                                 auto Serial = PayloadObj->get(uCentralProtocol::SERIAL).toString(); | ||||||
| 								auto Revision = Storage::TrimRevision( |                                 auto Revision = Storage::TrimRevision(PayloadObj->get(uCentralProtocol::FIRMWARE).toString()); | ||||||
| 									PayloadObj->get(uCentralProtocol::FIRMWARE).toString()); |                                 // std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << " DeviceType: " << DeviceType << " Revision:" << Revision << std::endl; | ||||||
| 								// std::cout << "ConnectionEvent: SerialNumber: " << SerialNumber << |  | ||||||
| 								// " DeviceType: " << DeviceType << " Revision:" << Revision << |  | ||||||
| 								// std::endl; |  | ||||||
|                                 FMSObjects::FirmwareAgeDetails  FA; |                                 FMSObjects::FirmwareAgeDetails  FA; | ||||||
| 								if (StorageService()->FirmwaresDB().ComputeFirmwareAge( |                                 if(StorageService()->FirmwaresDB().ComputeFirmwareAge(DeviceType, Revision, FA)) { | ||||||
| 										DeviceType, Revision, FA)) { |                                     StorageService()->DevicesDB().SetDeviceRevision(SerialNumber, Revision, DeviceType, EndPoint); | ||||||
| 									StorageService()->DevicesDB().SetDeviceRevision( |  | ||||||
| 										SerialNumber, Revision, DeviceType, EndPoint); |  | ||||||
|                                     if(FA.age) |                                     if(FA.age) | ||||||
| 										poco_information( |                                         poco_information(Logger(),fmt::format("Device {} connection. Firmware is {} older than latest.",SerialNumber, Utils::SecondsToNiceText(FA.age))); | ||||||
| 											Logger(), |  | ||||||
| 											fmt::format("Device {} connection. Firmware is {} " |  | ||||||
| 														"older than latest.", |  | ||||||
| 														SerialNumber, |  | ||||||
| 														Utils::SecondsToNiceText(FA.age))); |  | ||||||
|                                     else |                                     else | ||||||
| 										poco_information(Logger(), |                                     poco_information(Logger(),fmt::format("Device {} connection. Device firmware is up to date.",SerialNumber)); | ||||||
| 														 fmt::format("Device {} connection. Device " |                                 } | ||||||
| 																	 "firmware is up to date.", |                                 else { | ||||||
| 																	 SerialNumber)); |                                     poco_information(Logger(),fmt::format("Device {} connection. Firmware age cannot be determined.",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 |                                     // std::cout << "Device (connection): " << SerialNumber << " to be upgraded ... " << std::endl; | ||||||
| 									// 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 = |                             auto DisconnectMessage = PayloadObj->getObject(uCentralProtocol::DISCONNECTION); | ||||||
| 								PayloadObj->getObject(uCentralProtocol::DISCONNECTION); |                             if(DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) { | ||||||
| 							if (DisconnectMessage->has(uCentralProtocol::SERIALNUMBER) && |                                 auto SNum = DisconnectMessage->get(uCentralProtocol::SERIALNUMBER).toString(); | ||||||
| 								DisconnectMessage->has(uCentralProtocol::TIMESTAMP)) { |                                 auto Timestamp = DisconnectMessage->get(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; | ||||||
|                             } |                             } | ||||||
| @@ -124,18 +99,13 @@ 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( |                                 auto Revision = Storage::TrimRevision(PingMessage->get(uCentralProtocol::FIRMWARE).toString()); | ||||||
| 									PingMessage->get(uCentralProtocol::FIRMWARE).toString()); |                                 auto Serial = PingMessage->get( uCentralProtocol::SERIALNUMBER).toString(); | ||||||
| 								auto Serial = |                                 auto DeviceType = PingMessage->get( uCentralProtocol::COMPATIBLE).toString(); | ||||||
| 									PingMessage->get(uCentralProtocol::SERIALNUMBER).toString(); |                                 StorageService()->DevicesDB().SetDeviceRevision(Serial, Revision, DeviceType, EndPoint); | ||||||
| 								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 |                                     // std::cout << "Device(ping): " << SerialNumber << " to be upgraded ... " << std::endl; | ||||||
| 									// upgraded ... " << std::endl; |  | ||||||
|                                     AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType); |                                     AutoUpdater()->ToBeUpgraded(SerialNumber, DeviceType); | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
| @@ -150,9 +120,7 @@ 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) { |         Types::TopicNotifyFunction F = [this](std::string s1,std::string s2) { this->ConnectionReceived(s1,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; | ||||||
| @@ -172,9 +140,8 @@ namespace OpenWifi { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void NewConnectionHandler::ConnectionReceived(const std::string &Key, |     void NewConnectionHandler::ConnectionReceived( const std::string & Key, const std::string & Message) { | ||||||
| 												  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 | } | ||||||
| @@ -4,13 +4,14 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "framework/OpenWifiTypes.h" |  | ||||||
| #include "framework/SubSystemServer.h" | #include "framework/SubSystemServer.h" | ||||||
|  | #include "framework/OpenWifiTypes.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_; | ||||||
| @@ -29,8 +30,11 @@ 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 | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,40 +2,48 @@ | |||||||
| // Created by stephane bourque on 2021-10-23. | // Created by stephane bourque on 2021-10-23. | ||||||
| // | // | ||||||
|  |  | ||||||
| #include "RESTAPI/RESTAPI_connectedDeviceHandler.h" | #include "framework/RESTAPI_Handler.h" | ||||||
| #include "RESTAPI/RESTAPI_connectedDevicesHandler.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_firmwareHandler.h" | ||||||
| #include "RESTAPI/RESTAPI_firmwaresHandler.h" | #include "RESTAPI/RESTAPI_firmwaresHandler.h" | ||||||
|  | #include "RESTAPI/RESTAPI_firmwareAgeHandler.h" | ||||||
|  | #include "RESTAPI/RESTAPI_connectedDeviceHandler.h" | ||||||
|  | #include "RESTAPI/RESTAPI_connectedDevicesHandler.h" | ||||||
| #include "RESTAPI/RESTAPI_historyHandler.h" | #include "RESTAPI/RESTAPI_historyHandler.h" | ||||||
| #include "framework/RESTAPI_Handler.h" | #include "RESTAPI/RESTAPI_deviceReportHandler.h" | ||||||
|  | #include "RESTAPI/RESTAPI_deviceInformation_handler.h" | ||||||
| #include "framework/RESTAPI_SystemCommand.h" | #include "framework/RESTAPI_SystemCommand.h" | ||||||
| #include "framework/RESTAPI_SystemConfiguration.h" |  | ||||||
| #include "framework/RESTAPI_WebSocketServer.h" | #include "framework/RESTAPI_WebSocketServer.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	Poco::Net::HTTPRequestHandler * |     Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings, | ||||||
| 	RESTAPI_ExtRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings, |  | ||||||
|                                                             Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) { |                                                             Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) { | ||||||
| 		return RESTAPI_Router<RESTAPI_firmwaresHandler, RESTAPI_system_configuration, RESTAPI_firmwareHandler, |         return  RESTAPI_Router< | ||||||
| 							  RESTAPI_system_command, RESTAPI_firmwareAgeHandler, |                 RESTAPI_firmwaresHandler, | ||||||
| 							  RESTAPI_connectedDevicesHandler, RESTAPI_connectedDeviceHandler, |                 RESTAPI_firmwareHandler, | ||||||
| 							  RESTAPI_historyHandler, RESTAPI_deviceReportHandler, |                 RESTAPI_system_command, | ||||||
| 							  RESTAPI_deviceInformation_handler, RESTAPI_webSocketServer>( |                 RESTAPI_firmwareAgeHandler, | ||||||
| 			Path, Bindings, L, S, TransactionId); |                 RESTAPI_connectedDevicesHandler, | ||||||
|  |                 RESTAPI_connectedDeviceHandler, | ||||||
|  |                 RESTAPI_historyHandler, | ||||||
|  |                 RESTAPI_deviceReportHandler, | ||||||
|  |                 RESTAPI_deviceInformation_handler, | ||||||
|  |                 RESTAPI_webSocketServer | ||||||
|  |             >(Path,Bindings,L, S, TransactionId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	Poco::Net::HTTPRequestHandler * |     Poco::Net::HTTPRequestHandler * RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings, | ||||||
| 	RESTAPI_IntRouter(const std::string &Path, RESTAPIHandler::BindingMap &Bindings, |  | ||||||
|                                                             Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) { |                                                             Poco::Logger & L, RESTAPI_GenericServerAccounting & S, uint64_t TransactionId) { | ||||||
| 		return RESTAPI_Router_I<RESTAPI_firmwaresHandler, RESTAPI_system_configuration, RESTAPI_firmwareHandler, |         return RESTAPI_Router_I< | ||||||
| 								RESTAPI_system_command, RESTAPI_firmwareAgeHandler, |                 RESTAPI_firmwaresHandler, | ||||||
| 								RESTAPI_connectedDevicesHandler, RESTAPI_connectedDeviceHandler, |                 RESTAPI_firmwareHandler, | ||||||
| 								RESTAPI_historyHandler, RESTAPI_deviceReportHandler, |                 RESTAPI_system_command, | ||||||
| 								RESTAPI_deviceInformation_handler>(Path, Bindings, L, S, |                 RESTAPI_firmwareAgeHandler, | ||||||
| 																   TransactionId); |                 RESTAPI_connectedDevicesHandler, | ||||||
|  |                 RESTAPI_connectedDeviceHandler, | ||||||
|  |                 RESTAPI_historyHandler, | ||||||
|  |                 RESTAPI_deviceReportHandler, | ||||||
|  |                 RESTAPI_deviceInformation_handler | ||||||
|  |             >(Path, Bindings, L, S, TransactionId); | ||||||
|  |     } | ||||||
| } | } | ||||||
| } // namespace OpenWifi |  | ||||||
| @@ -24,4 +24,4 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|         NotFound(); |         NotFound(); | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi | } | ||||||
| @@ -10,22 +10,21 @@ | |||||||
| 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_connectedDeviceHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 									   RESTAPI_GenericServerAccounting &Server, |  | ||||||
| 									   uint64_t TransactionId, bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                           Server, | ||||||
| 		static auto PathName() { |                                           TransactionId, | ||||||
| 			return std::list<std::string>{"/api/v1/connectedDevice/{serialNumber}"}; |                                           Internal) {} | ||||||
| 		} |         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/Array.h" |  | ||||||
| #include "Poco/JSON/Object.h" | #include "Poco/JSON/Object.h" | ||||||
|  | #include "Poco/JSON/Array.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,24 +5,27 @@ | |||||||
| #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/RESTAPI_Handler.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|     class RESTAPI_connectedDevicesHandler : public RESTAPIHandler { |     class RESTAPI_connectedDevicesHandler : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
| 		RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, |         RESTAPI_connectedDevicesHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 										RESTAPI_GenericServerAccounting &Server, |  | ||||||
| 										uint64_t TransactionId, bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                           Server, | ||||||
|  |                                           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 "LatestFirmwareCache.h" |  | ||||||
| #include "StorageService.h" | #include "StorageService.h" | ||||||
|  | #include "LatestFirmwareCache.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 | } | ||||||
| @@ -9,19 +9,18 @@ | |||||||
| 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, |         RESTAPI_deviceInformation_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 										  Poco::Logger &L, RESTAPI_GenericServerAccounting &Server, |  | ||||||
| 										  uint64_t TransactionId, bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                  Server, | ||||||
| 		static auto PathName() { |                                  TransactionId, | ||||||
| 			return std::list<std::string>{"/api/v1/deviceInformation/{serialNumber}"}; |                                  Internal) {} | ||||||
| 		} |         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,9 +3,9 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #include "RESTAPI_deviceReportHandler.h" | #include "RESTAPI_deviceReportHandler.h" | ||||||
| #include "Daemon.h" |  | ||||||
| #include "Poco/JSON/Object.h" |  | ||||||
| #include "RESTObjects/RESTAPI_FMSObjects.h" | #include "RESTObjects/RESTAPI_FMSObjects.h" | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|     void RESTAPI_deviceReportHandler::DoGet() { |     void RESTAPI_deviceReportHandler::DoGet() { | ||||||
| @@ -18,4 +18,4 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|         return BadRequest(RESTAPI::Errors::InternalError); |         return BadRequest(RESTAPI::Errors::InternalError); | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi | } | ||||||
| @@ -9,17 +9,18 @@ | |||||||
| 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_deviceReportHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 									RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId, |  | ||||||
| 									bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                           Server, | ||||||
|  |                                           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 "DeviceCache.h" |  | ||||||
| #include "Poco/JSON/Parser.h" |  | ||||||
| #include "StorageService.h" | #include "StorageService.h" | ||||||
|  | #include "Poco/JSON/Parser.h" | ||||||
|  | #include "DeviceCache.h" | ||||||
| #include "framework/ow_constants.h" | #include "framework/ow_constants.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
| @@ -17,8 +17,7 @@ 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, |                     if(StorageService()->FirmwaresDB().ComputeFirmwareAge(E.deviceType,E.revision,FA)) { | ||||||
| 																		   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); | ||||||
| @@ -38,8 +37,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 = ORM::Escape(GetParameter(RESTAPI::Protocol::DEVICETYPE, "")); |             auto DeviceType = GetParameter(RESTAPI::Protocol::DEVICETYPE, ""); | ||||||
| 			auto Revision = ORM::Escape(GetParameter(RESTAPI::Protocol::REVISION, "")); |             auto Revision = GetParameter(RESTAPI::Protocol::REVISION, ""); | ||||||
|  |  | ||||||
|             if (DeviceType.empty() || Revision.empty()) { |             if (DeviceType.empty() || Revision.empty()) { | ||||||
|                 return BadRequest(RESTAPI::Errors::BothDeviceTypeRevision); |                 return BadRequest(RESTAPI::Errors::BothDeviceTypeRevision); | ||||||
| @@ -57,4 +56,4 @@ namespace OpenWifi { | |||||||
|             NotFound(); |             NotFound(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi | } | ||||||
| @@ -10,19 +10,20 @@ | |||||||
| 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_firmwareAgeHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 								   RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId, |  | ||||||
| 								   bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                           Server, | ||||||
|  |                                           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 | ||||||
|   | |||||||
| @@ -6,12 +6,13 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI/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/MicroServiceFuncs.h" | ||||||
| #include "framework/utils.h" | #include "framework/utils.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
| 	void RESTAPI_firmwareHandler::DoPost() { |     void | ||||||
|  |     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)) { | ||||||
| @@ -26,7 +27,8 @@ namespace OpenWifi { | |||||||
|         BadRequest(RESTAPI::Errors::RecordNotCreated); |         BadRequest(RESTAPI::Errors::RecordNotCreated); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void RESTAPI_firmwareHandler::DoGet() { |     void | ||||||
|  |     RESTAPI_firmwareHandler::DoGet() { | ||||||
|         auto UUID = GetBinding(uCentralProtocol::ID, ""); |         auto UUID = GetBinding(uCentralProtocol::ID, ""); | ||||||
|  |  | ||||||
|         if(UUID.empty()) { |         if(UUID.empty()) { | ||||||
| @@ -42,7 +44,8 @@ namespace OpenWifi { | |||||||
|         NotFound(); |         NotFound(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void RESTAPI_firmwareHandler::DoDelete() { |     void | ||||||
|  |     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); | ||||||
| @@ -75,12 +78,9 @@ 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>( |             NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get(RESTAPI::Protocol::NOTES).toString()); | ||||||
| 				Obj->get(RESTAPI::Protocol::NOTES).toString()); |  | ||||||
|             for(auto const &i:NIV) { |             for(auto const &i:NIV) { | ||||||
| 				SecurityObjects::NoteInfo ii{.created = (uint64_t)Utils::Now(), |                 SecurityObjects::NoteInfo   ii{.created=(uint64_t)Utils::Now(), .createdBy=UserInfo_.userinfo.email, .note=i.note}; | ||||||
| 											 .createdBy = UserInfo_.userinfo.email, |  | ||||||
| 											 .note = i.note}; |  | ||||||
|                 F.notes.push_back(ii); |                 F.notes.push_back(ii); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -92,4 +92,4 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|         BadRequest(RESTAPI::Errors::RecordNotUpdated); |         BadRequest(RESTAPI::Errors::RecordNotUpdated); | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi | } | ||||||
| @@ -10,22 +10,23 @@ | |||||||
| 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_firmwareHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 								RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId, |  | ||||||
| 								bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {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, TransactionId, Internal) {} |                                           Server, | ||||||
|  |                                           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,23 +3,18 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #include "RESTAPI_firmwaresHandler.h" | #include "RESTAPI_firmwaresHandler.h" | ||||||
| #include "LatestFirmwareCache.h" |  | ||||||
| #include "StorageService.h" | #include "StorageService.h" | ||||||
|  | #include "LatestFirmwareCache.h" | ||||||
| #include "framework/ow_constants.h" | #include "framework/ow_constants.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
| 	void RESTAPI_firmwaresHandler::DoGet() { |     void | ||||||
| 		std::string DeviceType = ORM::Escape(GetParameter(RESTAPI::Protocol::DEVICETYPE, "")); |     RESTAPI_firmwaresHandler::DoGet() { | ||||||
|  |         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; | ||||||
| @@ -65,8 +60,7 @@ 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, |                 if (StorageService()->FirmwaresDB().GetFirmwares(QB_.Offset, QB_.Limit, DeviceType, List)) { | ||||||
| 																 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)) | ||||||
| @@ -107,20 +101,4 @@ 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 |  | ||||||
|   | |||||||
| @@ -10,21 +10,21 @@ | |||||||
| 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_firmwaresHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 								 RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId, |  | ||||||
| 								 bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
| 													  Poco::Net::HTTPRequest::HTTP_PUT, |                                          {Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, |                                           Poco::Net::HTTPRequest::HTTP_OPTIONS}, | ||||||
| 							 Server, TransactionId, Internal) {} |                                           Server, | ||||||
|  |                                           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,8 +7,9 @@ | |||||||
| #include "framework/ow_constants.h" | #include "framework/ow_constants.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
| 	void RESTAPI_historyHandler::DoGet() { |     void | ||||||
| 		auto SerialNumber = ORM::Escape(GetBinding(RESTAPI::Protocol::SERIALNUMBER, "")); |     RESTAPI_historyHandler::DoGet() { | ||||||
|  |         auto SerialNumber = GetBinding(RESTAPI::Protocol::SERIALNUMBER, ""); | ||||||
|  |  | ||||||
|         if(SerialNumber.empty()) { |         if(SerialNumber.empty()) { | ||||||
|             return BadRequest(RESTAPI::Errors::MissingSerialNumber); |             return BadRequest(RESTAPI::Errors::MissingSerialNumber); | ||||||
| @@ -18,8 +19,7 @@ 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, |             StorageService()->HistoryDB().GetUnknownDeviceFirmwares(QB_.Offset,QB_.Limit,L.devices); | ||||||
| 																	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 | } | ||||||
| @@ -9,20 +9,19 @@ | |||||||
| 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_historyHandler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, RESTAPI_GenericServerAccounting & Server, uint64_t TransactionId, bool Internal) | ||||||
| 							   RESTAPI_GenericServerAccounting &Server, uint64_t TransactionId, |  | ||||||
| 							   bool Internal) |  | ||||||
|                 : RESTAPIHandler(bindings, L, |                 : RESTAPIHandler(bindings, L, | ||||||
| 							 std::vector<std::string>{Poco::Net::HTTPRequest::HTTP_GET, |                                  std::vector<std::string> | ||||||
|  |                                          {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, TransactionId, Internal) {} |                                           Server, | ||||||
| 		static auto PathName() { |                                           TransactionId, | ||||||
| 			return std::list<std::string>{"/api/v1/revisionHistory/{serialNumber}"}; |                                           Internal) {} | ||||||
| 		} |         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 | } | ||||||
|   | |||||||
| @@ -6,14 +6,16 @@ | |||||||
| #include "RESTAPI_ProvObjects.h" | #include "RESTAPI_ProvObjects.h" | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_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); | ||||||
| @@ -34,6 +36,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -49,6 +52,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -106,6 +110,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -119,6 +124,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -142,6 +148,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -211,6 +218,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -281,6 +289,7 @@ namespace OpenWifi::AnalyticsObjects { | |||||||
|  |  | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -300,6 +309,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -339,6 +349,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -356,6 +367,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -393,6 +405,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -420,6 +433,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -461,6 +475,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -476,6 +491,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -493,6 +509,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -514,6 +531,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -599,7 +617,8 @@ 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 | } | ||||||
| @@ -39,9 +39,13 @@ 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 { return info.id < bb.info.id; } |             inline bool operator<(const BoardInfo &bb) const { | ||||||
|  |                 return info.id < bb.info.id; | ||||||
|  |             } | ||||||
|  |  | ||||||
| 			inline bool operator==(const BoardInfo &bb) const { return info.id == bb.info.id; } |             inline bool operator==(const BoardInfo &bb) const { | ||||||
|  |                 return info.id == bb.info.id; | ||||||
|  |             } | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         struct DeviceInfo { |         struct DeviceInfo { | ||||||
| @@ -80,10 +84,15 @@ namespace OpenWifi { | |||||||
|             bool from_json(const Poco::JSON::Object::Ptr &Obj); |             bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
| 		enum wifi_band { band_2g = 0, band_5g = 1, band_6g = 2 }; |         enum wifi_band { | ||||||
|  |             band_2g = 0, band_5g = 1, band_6g = 2 | ||||||
|  |         }; | ||||||
|  |  | ||||||
|         struct TIDstat_entry { |         struct TIDstat_entry { | ||||||
| 			uint64_t rx_msdu = 0, tx_msdu = 0, tx_msdu_failed = 0, tx_msdu_retries = 0; |             uint64_t rx_msdu = 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); | ||||||
| @@ -102,7 +111,9 @@ namespace OpenWifi { | |||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         struct AveragePoint { |         struct AveragePoint { | ||||||
| 			double min = 0.0, max = 0.0, avg = 0.0; |             double      min = 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); | ||||||
|         }; |         }; | ||||||
| @@ -110,24 +121,49 @@ 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, rx_bytes = 0, tx_duration = 0, rx_packets = 0, tx_packets = 0, |             uint64_t tx_bytes = 0, | ||||||
| 					 tx_retries = 0, tx_failed = 0, connected = 0, inactive = 0; |                     rx_bytes = 0, | ||||||
|  |                     tx_duration = 0, | ||||||
|  |                     rx_packets = 0, | ||||||
|  |                     tx_packets = 0, | ||||||
|  |                     tx_retries = 0, | ||||||
|  |                     tx_failed = 0, | ||||||
|  |                     connected = 0, | ||||||
|  |                     inactive = 0; | ||||||
|  |  | ||||||
| 			double tx_bytes_bw = 0.0, rx_bytes_bw = 0.0, tx_packets_bw = 0.0, rx_packets_bw = 0.0, |             double  tx_bytes_bw = 0.0 , | ||||||
| 				   tx_failed_pct = 0.0, tx_retries_pct = 0.0, tx_duration_pct = 0.0; |                     rx_bytes_bw = 0.0 , | ||||||
|  |                     tx_packets_bw = 0.0 , | ||||||
|  |                     rx_packets_bw = 0.0 , | ||||||
|  |                     tx_failed_pct = 0.0 , | ||||||
|  |                     tx_retries_pct = 0.0 , | ||||||
|  |                     tx_duration_pct = 0.0; | ||||||
|  |  | ||||||
| 			uint64_t tx_bytes_delta = 0, rx_bytes_delta = 0, tx_duration_delta = 0, |             uint64_t    tx_bytes_delta = 0, | ||||||
| 					 rx_packets_delta = 0, tx_packets_delta = 0, tx_retries_delta = 0, |                         rx_bytes_delta = 0, | ||||||
|  |                         tx_duration_delta = 0, | ||||||
|  |                         rx_packets_delta = 0, | ||||||
|  |                         tx_packets_delta = 0, | ||||||
|  |                         tx_retries_delta = 0, | ||||||
|                         tx_failed_delta = 0; |                         tx_failed_delta = 0; | ||||||
|  |  | ||||||
| 			UE_rate tx_rate, rx_rate; |             UE_rate tx_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 { unknown = 0, ap, mesh, sta, wds_ap, wds_sta, wds_repeater }; |         enum SSID_MODES { | ||||||
|  |             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") | ||||||
| @@ -146,45 +182,82 @@ namespace OpenWifi { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         struct SSIDTimePoint { |         struct SSIDTimePoint { | ||||||
| 			std::string bssid, mode, ssid; |             std::string bssid, | ||||||
| 			uint64_t band = 0, channel = 0; |                         mode, | ||||||
|  |                         ssid; | ||||||
|  |             uint64_t    band=0, | ||||||
|  |                         channel=0; | ||||||
|             std::vector<UETimePoint> associations; |             std::vector<UETimePoint> associations; | ||||||
|  |  | ||||||
| 			AveragePoint tx_bytes_bw, rx_bytes_bw, tx_packets_bw, rx_packets_bw, tx_failed_pct, |             AveragePoint    tx_bytes_bw, | ||||||
| 				tx_retries_pct, tx_duration_pct; |                             rx_bytes_bw, | ||||||
|  |                             tx_packets_bw, | ||||||
|  |                             rx_packets_bw, | ||||||
|  |                             tx_failed_pct, | ||||||
|  |                             tx_retries_pct, | ||||||
|  |                             tx_duration_pct; | ||||||
|  |  | ||||||
|             void to_json(Poco::JSON::Object &Obj) const; |             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 { |  | ||||||
| 			uint64_t collisions = 0, multicast = 0, rx_bytes = 0, rx_dropped = 0, rx_errors = 0, |  | ||||||
| 					 rx_packets = 0, tx_bytes = 0, tx_dropped = 0, tx_errors = 0, tx_packets = 0; |  | ||||||
|  |  | ||||||
| 			double tx_bytes_bw = 0.0, rx_bytes_bw = 0.0, rx_dropped_pct = 0.0, tx_dropped_pct = 0.0, |         struct APTimePoint { | ||||||
| 				   rx_packets_bw = 0.0, tx_packets_bw = 0.0, rx_errors_pct = 0.0, |             uint64_t    collisions = 0, | ||||||
|  |                         multicast = 0, | ||||||
|  |                         rx_bytes = 0, | ||||||
|  |                         rx_dropped = 0, | ||||||
|  |                         rx_errors = 0, | ||||||
|  |                         rx_packets = 0, | ||||||
|  |                         tx_bytes = 0, | ||||||
|  |                         tx_dropped = 0, | ||||||
|  |                         tx_errors = 0, | ||||||
|  |                         tx_packets = 0; | ||||||
|  |  | ||||||
|  |             double      tx_bytes_bw = 0.0 , | ||||||
|  |                         rx_bytes_bw = 0.0 , | ||||||
|  |                         rx_dropped_pct = 0.0, | ||||||
|  |                         tx_dropped_pct = 0.0, | ||||||
|  |                         rx_packets_bw = 0.0, | ||||||
|  |                         tx_packets_bw = 0.0, | ||||||
|  |                         rx_errors_pct = 0.0 , | ||||||
|                         tx_errors_pct = 0.0; |                         tx_errors_pct = 0.0; | ||||||
|  |  | ||||||
| 			uint64_t tx_bytes_delta = 0, rx_bytes_delta = 0, rx_dropped_delta = 0, |             uint64_t    tx_bytes_delta = 0, | ||||||
| 					 tx_dropped_delta = 0, rx_packets_delta = 0, tx_packets_delta = 0, |                         rx_bytes_delta = 0 , | ||||||
| 					 rx_errors_delta = 0, tx_errors_delta = 0; |                         rx_dropped_delta = 0, | ||||||
|  |                         tx_dropped_delta = 0, | ||||||
|  |                         rx_packets_delta = 0, | ||||||
|  |                         tx_packets_delta = 0, | ||||||
|  |                         rx_errors_delta = 0, | ||||||
|  |                         tx_errors_delta = 0; | ||||||
|  |  | ||||||
|             void to_json(Poco::JSON::Object &Obj) const; |             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, channel_width = 0; |             uint64_t    band = 0, | ||||||
| 			uint64_t active_ms = 0, busy_ms = 0, receive_ms = 0, transmit_ms = 0, tx_power = 0, |                         channel_width = 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, noise = 0; |             int64_t     temperature = 0, | ||||||
|  |                         noise = 0; | ||||||
|  |  | ||||||
| 			double active_pct = 0.0, busy_pct = 0.0, receive_pct = 0.0, transmit_pct = 0.0; |             double      active_pct = 0.0 , | ||||||
|  |                         busy_pct = 0.0, | ||||||
|  |                         receive_pct = 0.0, | ||||||
|  |                         transmit_pct = 0.0; | ||||||
|  |  | ||||||
|             void to_json(Poco::JSON::Object &Obj) const; |             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; | ||||||
| @@ -209,8 +282,7 @@ namespace OpenWifi { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             inline bool operator==(const DeviceTimePoint &rhs) const { |             inline bool operator==(const DeviceTimePoint &rhs) const { | ||||||
| 				return timestamp == rhs.timestamp && |                 return timestamp==rhs.timestamp && device_info.serialNumber==rhs.device_info.serialNumber; | ||||||
| 					   device_info.serialNumber == rhs.device_info.serialNumber; |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             inline bool operator>(const DeviceTimePoint &rhs) const { |             inline bool operator>(const DeviceTimePoint &rhs) const { | ||||||
| @@ -222,6 +294,7 @@ namespace OpenWifi { | |||||||
|                     return true; |                     return true; | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         struct DeviceTimePointAnalysis { |         struct DeviceTimePointAnalysis { | ||||||
| @@ -246,6 +319,7 @@ 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 { | ||||||
| @@ -257,9 +331,12 @@ 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; | ||||||
| @@ -272,7 +349,10 @@ namespace OpenWifi { | |||||||
|         struct RadioAnalysis { |         struct RadioAnalysis { | ||||||
|             uint64_t                timestamp=0; |             uint64_t                timestamp=0; | ||||||
|             AverageValueSigned      noise, temperature; |             AverageValueSigned      noise, temperature; | ||||||
| 			AverageValueUnsigned active_ms, busy_ms, transmit_ms, receive_ms; |             AverageValueUnsigned    active_ms, | ||||||
|  |                                     busy_ms, | ||||||
|  |                                     transmit_ms, | ||||||
|  |                                     receive_ms; | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         struct DeviceTimePointStats { |         struct DeviceTimePointStats { | ||||||
| @@ -338,6 +418,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 | } | ||||||
| @@ -5,8 +5,8 @@ | |||||||
| #include "RESTAPI_CertObjects.h" | #include "RESTAPI_CertObjects.h" | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_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,7 +30,6 @@ 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) { | ||||||
| @@ -55,7 +54,6 @@ 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 (...) { | ||||||
|         } |         } | ||||||
| @@ -209,4 +207,4 @@ namespace OpenWifi::CertObjects { | |||||||
|         monthlyNumberOfCerts.clear(); |         monthlyNumberOfCerts.clear(); | ||||||
|         monthlyNumberOfCertsPerOrgPerYear.clear(); |         monthlyNumberOfCertsPerOrgPerYear.clear(); | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi::CertObjects | } | ||||||
| @@ -4,9 +4,9 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "RESTObjects/RESTAPI_SecurityObjects.h" |  | ||||||
| #include "framework/OpenWifiTypes.h" |  | ||||||
| #include <string> | #include <string> | ||||||
|  | #include "framework/OpenWifiTypes.h" | ||||||
|  | #include "RESTObjects/RESTAPI_SecurityObjects.h" | ||||||
|  |  | ||||||
| namespace OpenWifi::CertObjects { | namespace OpenWifi::CertObjects { | ||||||
|  |  | ||||||
| @@ -31,7 +31,6 @@ 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); | ||||||
| @@ -121,4 +120,4 @@ namespace OpenWifi::CertObjects { | |||||||
|         void reset(); |         void reset(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| } // namespace OpenWifi::CertObjects | } | ||||||
| @@ -6,8 +6,8 @@ | |||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
| #include "framework/utils.h" | #include "framework/utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  |  | ||||||
| namespace OpenWifi::FMSObjects { | namespace OpenWifi::FMSObjects { | ||||||
|  |  | ||||||
| @@ -54,6 +54,7 @@ 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,6 +68,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -100,6 +102,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -113,6 +116,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -138,6 +142,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -151,6 +156,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -176,6 +182,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -199,6 +206,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -234,6 +242,7 @@ namespace OpenWifi::FMSObjects { | |||||||
|  |  | ||||||
|             return true; |             return true; | ||||||
|         } catch (...) { |         } catch (...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -261,6 +270,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -278,6 +288,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -291,8 +302,9 @@ 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 | } | ||||||
|   | |||||||
| @@ -13,16 +13,15 @@ | |||||||
| #ifdef	TIP_GATEWAY_SERVICE | #ifdef	TIP_GATEWAY_SERVICE | ||||||
| #include "AP_WS_Server.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/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
| #include "framework/utils.h" | #include "framework/utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::EmbedDocument; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::EmbedDocument; | ||||||
|  |  | ||||||
| namespace OpenWifi::GWObjects { | namespace OpenWifi::GWObjects { | ||||||
|  |  | ||||||
| @@ -30,7 +29,6 @@ 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); | ||||||
| @@ -56,9 +54,6 @@ namespace OpenWifi::GWObjects { | |||||||
| 		field_to_json(Obj,"pendingConfiguration", pendingConfiguration); | 		field_to_json(Obj,"pendingConfiguration", pendingConfiguration); | ||||||
| 		field_to_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd); | 		field_to_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd); | ||||||
| 		field_to_json(Obj,"restrictionDetails", restrictionDetails); | 		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 { | ||||||
| @@ -68,7 +63,7 @@ namespace OpenWifi::GWObjects { | |||||||
| 		ConnectionState ConState; | 		ConnectionState ConState; | ||||||
|  |  | ||||||
| 		if (AP_WS_Server()->GetState(SerialNumber, ConState)) { | 		if (AP_WS_Server()->GetState(SerialNumber, ConState)) { | ||||||
| 			ConState.to_json(SerialNumber,Obj); | 			ConState.to_json(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); | ||||||
| @@ -80,13 +75,6 @@ namespace OpenWifi::GWObjects { | |||||||
| 			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,"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 | ||||||
| 	} | 	} | ||||||
| @@ -96,32 +84,20 @@ 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, "createdTimestamp", CreationTimestamp); | 			field_from_json(Obj,"manufacturer",Manufacturer); | ||||||
| 			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,"restrictedDevice", restrictedDevice); | ||||||
| 			field_from_json(Obj,"pendingConfiguration", pendingConfiguration); | 			field_from_json(Obj,"pendingConfiguration", pendingConfiguration); | ||||||
| 			field_from_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd); | 			field_from_json(Obj,"pendingConfigurationCmd", pendingConfigurationCmd); | ||||||
| 			field_from_json(Obj,"restrictionDetails", restrictionDetails); | 			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) { | ||||||
| 		} | 		} | ||||||
| @@ -129,9 +105,8 @@ namespace OpenWifi::GWObjects { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void Device::Print() const { | 	void Device::Print() const { | ||||||
| 		std::cout << "Device: " << SerialNumber << " DeviceType:" << DeviceType | 		std::cout << "Device: " << SerialNumber << " DeviceType:" << DeviceType << " MACAddress:" << MACAddress << " Manufacturer:" | ||||||
| 				  << " MACAddress:" << MACAddress << " Manufacturer:" << Manufacturer << " " | 				  << Manufacturer << " " << Configuration << std::endl; | ||||||
| 				  << Configuration << std::endl; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void Statistics::to_json(Poco::JSON::Object &Obj) const { | 	void Statistics::to_json(Poco::JSON::Object &Obj) const { | ||||||
| @@ -171,31 +146,6 @@ 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); | ||||||
| @@ -214,8 +164,6 @@ 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) { | ||||||
| @@ -249,7 +197,7 @@ namespace OpenWifi::GWObjects { | |||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber, Poco::JSON::Object &Obj)  { | 	void ConnectionState::to_json(Poco::JSON::Object &Obj) const { | ||||||
| 		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); | ||||||
| @@ -271,42 +219,18 @@ namespace OpenWifi::GWObjects { | |||||||
| 		field_to_json(Obj,"connectionCompletionTime", connectionCompletionTime); | 		field_to_json(Obj,"connectionCompletionTime", connectionCompletionTime); | ||||||
| 		field_to_json(Obj,"totalConnectionTime", Utils::Now() - started); | 		field_to_json(Obj,"totalConnectionTime", Utils::Now() - started); | ||||||
| 		field_to_json(Obj,"certificateExpiryDate", certificateExpiryDate); | 		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"); | 				field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break; | ||||||
| 			break; |  | ||||||
| 			case VALID_CERTIFICATE: | 			case VALID_CERTIFICATE: | ||||||
| 			field_to_json(Obj, "verifiedCertificate", "VALID_CERTIFICATE"); | 				field_to_json(Obj,"verifiedCertificate", "VALID_CERTIFICATE"); break; | ||||||
| 			break; |  | ||||||
| 			case MISMATCH_SERIAL: | 			case MISMATCH_SERIAL: | ||||||
| 			field_to_json(Obj, "verifiedCertificate", "MISMATCH_SERIAL"); | 				field_to_json(Obj,"verifiedCertificate", "MISMATCH_SERIAL"); break; | ||||||
| 			break; |  | ||||||
| 			case VERIFIED: | 			case VERIFIED: | ||||||
| 			field_to_json(Obj, "verifiedCertificate", "VERIFIED"); | 				field_to_json(Obj,"verifiedCertificate", "VERIFIED"); break; | ||||||
| 			break; |  | ||||||
| 		case SIMULATED: |  | ||||||
| 			field_to_json(Obj, "verifiedCertificate", "SIMULATED"); |  | ||||||
| 			break; |  | ||||||
| 			default: | 			default: | ||||||
| 			field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE"); | 				field_to_json(Obj,"verifiedCertificate", "NO_CERTIFICATE"); break; | ||||||
| 			break; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -430,10 +354,6 @@ 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) { | ||||||
| @@ -444,10 +364,6 @@ 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) { | ||||||
| 		} | 		} | ||||||
| @@ -568,29 +484,6 @@ namespace OpenWifi::GWObjects { | |||||||
| 		return false; | 		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 { | 	void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const { | ||||||
| 		field_to_json(Obj,"vendor", vendor); | 		field_to_json(Obj,"vendor", vendor); | ||||||
| 		field_to_json(Obj,"algo", algo); | 		field_to_json(Obj,"algo", algo); | ||||||
| @@ -604,6 +497,7 @@ namespace OpenWifi::GWObjects { | |||||||
| 		} catch (const Poco::Exception &E) { | 		} catch (const Poco::Exception &E) { | ||||||
| 		} | 		} | ||||||
| 		return false; | 		return false; | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void DeviceRestrictions::to_json(Poco::JSON::Object &Obj) const { | 	void DeviceRestrictions::to_json(Poco::JSON::Object &Obj) const { | ||||||
| @@ -635,84 +529,19 @@ namespace OpenWifi::GWObjects { | |||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	bool DeviceRestrictionsKeyInfo::operator!=( | 	bool DeviceRestrictionsKeyInfo::operator!=(const OpenWifi::GWObjects::DeviceRestrictionsKeyInfo &T) const { | ||||||
| 		const OpenWifi::GWObjects::DeviceRestrictionsKeyInfo &T) const { |  | ||||||
| 		return (T.algo!=algo) || (T.vendor!=vendor); | 		return (T.algo!=algo) || (T.vendor!=vendor); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	bool DeviceRestrictions::operator!=(const OpenWifi::GWObjects::DeviceRestrictions &T) const { | 	bool DeviceRestrictions::operator!=(const OpenWifi::GWObjects::DeviceRestrictions &T) const { | ||||||
| 		return ((T.dfs != dfs) || (T.rtty != rtty) || (T.upgrade != upgrade) || | 		return (	(T.dfs!=dfs)					|| | ||||||
| 				(T.commands != commands) || (T.developer != developer) || (T.ssh != ssh) || | 					(T.rtty!=rtty)					|| | ||||||
| 				(T.key_info != key_info) || (T.country != country)); | 					(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,13 +11,14 @@ | |||||||
| #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 { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED, SIMULATED }; | 	enum CertificateValidation { | ||||||
|  | 		NO_CERTIFICATE, | ||||||
|  | 		VALID_CERTIFICATE, | ||||||
|  | 		MISMATCH_SERIAL, | ||||||
|  | 		VERIFIED | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	struct ConnectionState { | 	struct ConnectionState { | ||||||
| 		uint64_t MessageCount = 0 ; | 		uint64_t MessageCount = 0 ; | ||||||
| @@ -42,15 +43,8 @@ namespace OpenWifi::GWObjects { | |||||||
| 		uint64_t 		sessionId=0; | 		uint64_t 		sessionId=0; | ||||||
| 		double      	connectionCompletionTime=0.0; | 		double      	connectionCompletionTime=0.0; | ||||||
| 		std::uint64_t	certificateExpiryDate=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) ; | 		void to_json(Poco::JSON::Object &Obj) const; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	struct DeviceRestrictionsKeyInfo { | 	struct DeviceRestrictionsKeyInfo { | ||||||
| @@ -107,9 +101,6 @@ namespace OpenWifi::GWObjects { | |||||||
| 		std::string pendingConfiguration; | 		std::string pendingConfiguration; | ||||||
| 		std::string pendingConfigurationCmd; | 		std::string pendingConfigurationCmd; | ||||||
| 		DeviceRestrictions	restrictionDetails; | 		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; | ||||||
| @@ -182,26 +173,6 @@ 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; | ||||||
| @@ -222,11 +193,7 @@ 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 { | ||||||
| @@ -360,10 +327,6 @@ 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); | ||||||
| @@ -376,139 +339,4 @@ namespace OpenWifi::GWObjects { | |||||||
| 		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 |  | ||||||
|   | |||||||
| @@ -4,9 +4,9 @@ | |||||||
|  |  | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::EmbedDocument; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::EmbedDocument; | ||||||
|  |  | ||||||
| #include "RESTAPI_OWLSobjects.h" | #include "RESTAPI_OWLSobjects.h" | ||||||
|  |  | ||||||
| @@ -61,6 +61,7 @@ namespace OpenWifi::OWLSObjects { | |||||||
|             field_from_json(Obj,"concurrentDevices", concurrentDevices); |             field_from_json(Obj,"concurrentDevices", concurrentDevices); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -74,6 +75,7 @@ namespace OpenWifi::OWLSObjects { | |||||||
|             field_from_json(Obj,"list", list); |             field_from_json(Obj,"list", list); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -92,12 +94,17 @@ namespace OpenWifi::OWLSObjects { | |||||||
|         field_to_json(Obj,"endTime", endTime); |         field_to_json(Obj,"endTime", endTime); | ||||||
|         field_to_json(Obj,"errorDevices", errorDevices); |         field_to_json(Obj,"errorDevices", errorDevices); | ||||||
|         field_to_json(Obj,"owner", owner); |         field_to_json(Obj,"owner", owner); | ||||||
|         field_to_json(Obj, "expectedDevices", expectedDevices); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	void Dashboard::to_json([[maybe_unused]] Poco::JSON::Object &Obj) const {} |     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() {} |     bool Dashboard::from_json([[maybe_unused]] const Poco::JSON::Object::Ptr &Obj) { | ||||||
| } // namespace OpenWifi::OWLSObjects |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void Dashboard::reset() { | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -5,8 +5,8 @@ | |||||||
| #ifndef UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | #ifndef UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | ||||||
| #define UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | #define UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | ||||||
|  |  | ||||||
| #include "Poco/JSON/Object.h" |  | ||||||
| #include <vector> | #include <vector> | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  |  | ||||||
| namespace OpenWifi::OWLSObjects { | namespace OpenWifi::OWLSObjects { | ||||||
|  |  | ||||||
| @@ -57,19 +57,21 @@ namespace OpenWifi::OWLSObjects { | |||||||
|         uint64_t        endTime; |         uint64_t        endTime; | ||||||
|         uint64_t        errorDevices; |         uint64_t        errorDevices; | ||||||
|         std::string     owner; |         std::string     owner; | ||||||
|         uint64_t expectedDevices; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|     struct Dashboard { |     struct Dashboard { | ||||||
|         int O; |         int O; | ||||||
|  |  | ||||||
|         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); | ||||||
|         void reset(); |         void reset(); | ||||||
|  |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| } // namespace OpenWifi::OWLSObjects | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif //UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | #endif //UCENTRALSIM_RESTAPI_OWLSOBJECTS_H | ||||||
|   | |||||||
| @@ -6,13 +6,14 @@ | |||||||
| //	Arilia Wireless Inc. | //	Arilia Wireless Inc. | ||||||
| // | // | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "RESTAPI_ProvObjects.h" | #include "RESTAPI_ProvObjects.h" | ||||||
| #include "framework/MicroServiceFuncs.h" |  | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  | #include "framework/MicroServiceFuncs.h" | ||||||
| #include "framework/utils.h" | #include "framework/utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  |  | ||||||
| namespace OpenWifi::ProvObjects { | namespace OpenWifi::ProvObjects { | ||||||
|  |  | ||||||
| @@ -37,6 +38,7 @@ 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,6 +58,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -75,6 +78,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -118,6 +122,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -133,6 +138,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -184,6 +190,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -255,6 +262,7 @@ 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 { | ||||||
| @@ -345,6 +353,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -384,6 +393,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -415,6 +425,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -428,6 +439,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -473,6 +485,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -516,6 +529,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -551,6 +565,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -564,6 +579,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -611,6 +627,7 @@ namespace OpenWifi::ProvObjects { | |||||||
|             field_from_json( Obj, "doNotAllowOverrides",doNotAllowOverrides); |             field_from_json( Obj, "doNotAllowOverrides",doNotAllowOverrides); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -630,6 +647,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -643,6 +661,7 @@ 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; | ||||||
|     }; |     }; | ||||||
| @@ -662,6 +681,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -695,6 +715,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -704,7 +725,9 @@ namespace OpenWifi::ProvObjects { | |||||||
|         field_to_json(Obj, "devices", tenants); |         field_to_json(Obj, "devices", tenants); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| 	void Report::reset() { tenants.clear(); } |     void Report::reset() { | ||||||
|  |         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); | ||||||
| @@ -719,6 +742,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -734,6 +758,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -747,17 +772,21 @@ 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 { field_to_json(Obj, "list", list); } |     void UuidList::to_json(Poco::JSON::Object &Obj) const { | ||||||
|  |         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; | ||||||
|     } |     } | ||||||
| @@ -775,17 +804,21 @@ 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 { field_to_json(Obj, "list", list); } |     void ObjectACLList::to_json(Poco::JSON::Object &Obj) const { | ||||||
|  |         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; | ||||||
|     } |     } | ||||||
| @@ -813,6 +846,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -826,6 +860,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -839,6 +874,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -876,6 +912,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -895,6 +932,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -908,6 +946,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -948,6 +987,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -967,6 +1007,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -1014,6 +1055,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -1027,6 +1069,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -1046,12 +1089,12 @@ 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, |     bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) { | ||||||
| 						  ObjectInfo &I) { |  | ||||||
|         uint64_t Now = Utils::Now(); |         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(); | ||||||
| @@ -1066,15 +1109,13 @@ 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( |             N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note}); | ||||||
| 				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, |     bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) { | ||||||
| 						  ObjectInfo &I) { |  | ||||||
|         uint64_t Now = Utils::Now(); |         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(); | ||||||
| @@ -1089,8 +1130,7 @@ 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( |             N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note}); | ||||||
| 				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; | ||||||
| @@ -1118,6 +1158,7 @@ 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; | ||||||
|     } |     } | ||||||
| @@ -1133,6 +1174,7 @@ namespace OpenWifi::ProvObjects { | |||||||
|             field_from_json(Obj,"parameters",parameters); |             field_from_json(Obj,"parameters",parameters); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -1150,6 +1192,7 @@ namespace OpenWifi::ProvObjects { | |||||||
|             field_from_json(Obj,"algorithms",algorithms); |             field_from_json(Obj,"algorithms",algorithms); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -1173,6 +1216,7 @@ namespace OpenWifi::ProvObjects { | |||||||
|             field_from_json(Obj,"modified",modified); |             field_from_json(Obj,"modified",modified); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } catch(...) { | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -1190,247 +1234,11 @@ namespace OpenWifi::ProvObjects { | |||||||
|             field_from_json(Obj,"overrides",overrides); |             field_from_json(Obj,"overrides",overrides); | ||||||
|             return true; |             return true; | ||||||
|         } catch(...) { |         } 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 |  | ||||||
|   | |||||||
| @@ -29,7 +29,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::TagList  tags; |         Types::TagList  tags; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -37,7 +36,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUIDvec_t    serialNumbers; |         Types::UUIDvec_t    serialNumbers; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -48,7 +46,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string policy; |         std::string policy; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -60,18 +57,14 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t       venue; |         Types::UUID_t       venue; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<ManagementPolicy>      ManagementPolicyVec; |     typedef std::vector<ManagementPolicy>      ManagementPolicyVec; | ||||||
|  |  | ||||||
|     struct RRMAlgorithmDetails { |     struct RRMAlgorithmDetails { | ||||||
|         std::string     name; |         std::string     name; | ||||||
|         std::string     parameters; |         std::string     parameters; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -79,9 +72,7 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string     vendor; |         std::string     vendor; | ||||||
|         std::string     schedule; |         std::string     schedule; | ||||||
|         std::vector<RRMAlgorithmDetails>    algorithms; |         std::vector<RRMAlgorithmDetails>    algorithms; | ||||||
|  |  | ||||||
|         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,7 +82,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string     firmwareUpgrade{"inherit"}; |         std::string     firmwareUpgrade{"inherit"}; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -114,10 +104,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUIDvec_t        configurations; |         Types::UUIDvec_t        configurations; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<Entity>      EntityVec; |     typedef std::vector<Entity>      EntityVec; | ||||||
|  |  | ||||||
|     struct DiGraphEntry { |     struct DiGraphEntry { | ||||||
| @@ -125,7 +113,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t child; |         Types::UUID_t child; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -153,10 +140,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUIDvec_t    boards; |         Types::UUIDvec_t    boards; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<Venue>      VenueVec; |     typedef std::vector<Venue>      VenueVec; | ||||||
|  |  | ||||||
|     struct UserInfoDigest { |     struct UserInfoDigest { | ||||||
| @@ -165,7 +150,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string     userType; |         std::string     userType; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -178,40 +162,25 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t       venue; |         Types::UUID_t       venue; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<ManagementRole>      ManagementRoleVec; |     typedef std::vector<ManagementRole>      ManagementRoleVec; | ||||||
|  |  | ||||||
|     enum LocationType { |     enum LocationType { | ||||||
|         LT_SERVICE, |         LT_SERVICE, LT_EQUIPMENT, LT_AUTO, LT_MANUAL, | ||||||
|         LT_EQUIPMENT, |         LT_SPECIAL, LT_UNKNOWN, LT_CORPORATE | ||||||
|         LT_AUTO, |  | ||||||
|         LT_MANUAL, |  | ||||||
|         LT_SPECIAL, |  | ||||||
|         LT_UNKNOWN, |  | ||||||
|         LT_CORPORATE |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline std::string to_string(LocationType L) { |     inline std::string to_string(LocationType L) { | ||||||
|         switch(L) { |         switch(L) { | ||||||
|             case LT_SERVICE: |             case LT_SERVICE: return "SERVICE"; | ||||||
|                 return "SERVICE"; |             case LT_EQUIPMENT: return "EQUIPMENT"; | ||||||
|             case LT_EQUIPMENT: |             case LT_AUTO: return "AUTO"; | ||||||
|                 return "EQUIPMENT"; |             case LT_MANUAL: return "MANUAL"; | ||||||
|             case LT_AUTO: |             case LT_SPECIAL: return "SPECIAL"; | ||||||
|                 return "AUTO"; |             case LT_UNKNOWN: return "UNKNOWN"; | ||||||
|             case LT_MANUAL: |             case LT_CORPORATE: return "CORPORATE"; | ||||||
|                 return "MANUAL"; |             default: return "UNKNOWN"; | ||||||
|             case LT_SPECIAL: |  | ||||||
|                 return "SPECIAL"; |  | ||||||
|             case LT_UNKNOWN: |  | ||||||
|                 return "UNKNOWN"; |  | ||||||
|             case LT_CORPORATE: |  | ||||||
|                 return "CORPORATE"; |  | ||||||
|             default: |  | ||||||
|                 return "UNKNOWN"; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -250,10 +219,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t       managementPolicy; |         Types::UUID_t       managementPolicy; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<Location>      LocationVec; |     typedef std::vector<Location>      LocationVec; | ||||||
|  |  | ||||||
|     struct OperatorLocation { |     struct OperatorLocation { | ||||||
| @@ -273,10 +240,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t       managementPolicy; |         Types::UUID_t       managementPolicy; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<Location>      LocationVec; |     typedef std::vector<Location>      LocationVec; | ||||||
|  |  | ||||||
|     struct SubLocation { |     struct SubLocation { | ||||||
| @@ -292,7 +257,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string         geoCode; |         std::string         geoCode; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -300,44 +264,27 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<OperatorLocation>    locations; |         std::vector<OperatorLocation>    locations; | ||||||
|  |  | ||||||
|         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 ContactType { |     enum ContactType { | ||||||
|         CT_SUBSCRIBER, |         CT_SUBSCRIBER, CT_USER, CT_INSTALLER, CT_CSR, CT_MANAGER, | ||||||
|         CT_USER, |         CT_BUSINESSOWNER, CT_TECHNICIAN, CT_CORPORATE, CT_UNKNOWN | ||||||
|         CT_INSTALLER, |  | ||||||
|         CT_CSR, |  | ||||||
|         CT_MANAGER, |  | ||||||
|         CT_BUSINESSOWNER, |  | ||||||
|         CT_TECHNICIAN, |  | ||||||
|         CT_CORPORATE, |  | ||||||
|         CT_UNKNOWN |  | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     inline std::string to_string(ContactType L) { |     inline std::string to_string(ContactType L) { | ||||||
|         switch(L) { |         switch(L) { | ||||||
|             case CT_SUBSCRIBER: |             case CT_SUBSCRIBER: return "SUBSCRIBER"; | ||||||
|                 return "SUBSCRIBER"; |             case CT_USER: return "USER"; | ||||||
|             case CT_USER: |             case CT_INSTALLER: return "INSTALLER"; | ||||||
|                 return "USER"; |             case CT_CSR: return "CSR"; | ||||||
|             case CT_INSTALLER: |             case CT_MANAGER: return "MANAGER"; | ||||||
|                 return "INSTALLER"; |             case CT_BUSINESSOWNER: return "BUSINESSOWNER"; | ||||||
|             case CT_CSR: |             case CT_TECHNICIAN: return "TECHNICIAN"; | ||||||
|                 return "CSR"; |             case CT_CORPORATE: return "CORPORATE"; | ||||||
|             case CT_MANAGER: |             case CT_UNKNOWN: return "UNKNOWN"; | ||||||
|                 return "MANAGER"; |             default: return "UNKNOWN"; | ||||||
|             case CT_BUSINESSOWNER: |  | ||||||
|                 return "BUSINESSOWNER"; |  | ||||||
|             case CT_TECHNICIAN: |  | ||||||
|                 return "TECHNICIAN"; |  | ||||||
|             case CT_CORPORATE: |  | ||||||
|                 return "CORPORATE"; |  | ||||||
|             case CT_UNKNOWN: |  | ||||||
|                 return "UNKNOWN"; |  | ||||||
|             default: |  | ||||||
|                 return "UNKNOWN"; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -380,10 +327,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t   managementPolicy; |         Types::UUID_t   managementPolicy; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<Contact>      ContactVec; |     typedef std::vector<Contact>      ContactVec; | ||||||
|  |  | ||||||
|     struct OperatorContact { |     struct OperatorContact { | ||||||
| @@ -405,7 +350,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t   managementPolicy; |         Types::UUID_t   managementPolicy; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -424,7 +368,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string     accessPIN; |         std::string     accessPIN; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -432,7 +375,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<OperatorContact>    contacts; |         std::vector<OperatorContact>    contacts; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -445,10 +387,8 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string configuration; |         std::string configuration; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec; |     typedef std::vector<DeviceConfigurationElement> DeviceConfigurationElementVec; | ||||||
|  |  | ||||||
|     struct DeviceConfiguration { |     struct DeviceConfiguration { | ||||||
| @@ -465,12 +405,11 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string                     subscriber; |         std::string                     subscriber; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     typedef std::vector<DeviceConfiguration>      DeviceConfigurationVec; |     typedef std::vector<DeviceConfiguration>      DeviceConfigurationVec; | ||||||
|  |  | ||||||
|  |  | ||||||
|     struct InventoryTag { |     struct InventoryTag { | ||||||
|         ObjectInfo      info; |         ObjectInfo      info; | ||||||
|         std::string     serialNumber; |         std::string     serialNumber; | ||||||
| @@ -492,7 +431,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         bool            doNotAllowOverrides=false; |         bool            doNotAllowOverrides=false; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -502,7 +440,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         InventoryTagVec     taglist; |         InventoryTagVec     taglist; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -513,7 +450,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         uint64_t            errorCode; |         uint64_t            errorCode; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -522,7 +458,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::CountedMap   tenants; |         Types::CountedMap   tenants; | ||||||
|  |  | ||||||
|         void        reset(); |         void        reset(); | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -532,7 +467,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string description; |         std::string description; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -541,7 +475,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<ExpandedUseEntry>   entries; |         std::vector<ExpandedUseEntry>   entries; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -549,7 +482,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<ExpandedUseEntryList>    entries; |         std::vector<ExpandedUseEntryList>    entries; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -557,7 +489,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUIDvec_t    list; |         Types::UUIDvec_t    list; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -571,7 +502,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         uint64_t        access = (uint64_t) NONE; |         uint64_t        access = (uint64_t) NONE; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -579,7 +509,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<ObjectACL>  list; |         std::vector<ObjectACL>  list; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -594,7 +523,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string         venue; |         std::string         venue; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -602,7 +530,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<Map>    list; |         std::vector<Map>    list; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -632,7 +559,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string         operatorId; |         std::string         operatorId; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -643,7 +569,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string         value; |         std::string         value; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -651,7 +576,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<Variable>   variables; |         std::vector<Variable>   variables; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -666,7 +590,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUID_t               managementPolicy; |         Types::UUID_t               managementPolicy; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -674,7 +597,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<VariableBlock>      variableBlocks; |         std::vector<VariableBlock>      variableBlocks; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -689,7 +611,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string                     registrationId; |         std::string                     registrationId; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -697,7 +618,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<Operator>            operators; |         std::vector<Operator>            operators; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -708,7 +628,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         Types::UUIDvec_t    devices; |         Types::UUIDvec_t    devices; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -724,7 +643,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         bool                            defaultService=false; |         bool                            defaultService=false; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -732,7 +650,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<ServiceClass>            serviceClasses; |         std::vector<ServiceClass>            serviceClasses; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -743,7 +660,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string                     firmwareRCOnly{"inherit"}; |         std::string                     firmwareRCOnly{"inherit"}; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -768,7 +684,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::string                     realMacAddress; |         std::string                     realMacAddress; | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |         void to_json(Poco::JSON::Object &Obj) const; | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |         bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -776,7 +691,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<SubscriberDevice>       subscriberDevices; |         std::vector<SubscriberDevice>       subscriberDevices; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -789,7 +703,6 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::uint64_t   modified; |         std::uint64_t   modified; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -799,119 +712,10 @@ namespace OpenWifi::ProvObjects { | |||||||
|         std::vector<ConfigurationOverride>  overrides; |         std::vector<ConfigurationOverride>  overrides; | ||||||
|  |  | ||||||
|         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); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, |     bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I); | ||||||
|                           ObjectInfo &I); |     bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I); | ||||||
|  |  | ||||||
|     bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, |  | ||||||
|                           ObjectInfo &I); |  | ||||||
|  |  | ||||||
|     bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I); |     bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I); | ||||||
|  |  | ||||||
|     struct GLBLRAccountInfo { |  | ||||||
|         ObjectInfo info; |  | ||||||
|         std::string privateKey; |  | ||||||
|         std::string country, province, city, organization, commonName; |  | ||||||
|         std::string CSR, CSRPrivateKey, CSRPublicKey; |  | ||||||
|         std::string GlobalReachAcctId; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|     struct GLBLRCertificateInfo { |  | ||||||
|         std::string id; |  | ||||||
|         std::string name; |  | ||||||
|         std::string accountId; |  | ||||||
|         std::string csr; |  | ||||||
|         std::string certificate; |  | ||||||
|         std::string certificateChain; |  | ||||||
|         std::string certificateId; |  | ||||||
|         std::uint64_t expiresAt = 0; |  | ||||||
|         std::uint64_t created = 0; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|  |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct GooglOrionAccountInfo { |  | ||||||
|         ObjectInfo info; |  | ||||||
|         std::string privateKey; |  | ||||||
|         std::string certificate; |  | ||||||
|         std::vector<std::string> cacerts; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct RADIUSServer { |  | ||||||
|         std::string     Hostname; |  | ||||||
|         std::string     IP; |  | ||||||
|         std::uint64_t   Port=0; |  | ||||||
|         std::string     Secret; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct RADIUSEndPointRadiusType { |  | ||||||
|         std::vector<RADIUSServer>    Authentication; |  | ||||||
|         std::vector<RADIUSServer>    Accounting; |  | ||||||
|         std::vector<RADIUSServer>    CoA; |  | ||||||
|         std::uint64_t AccountingInterval = 60; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct RADIUSEndPointRadsecType { |  | ||||||
|         std::string     Hostname; |  | ||||||
|         std::string     IP; |  | ||||||
|         std::uint64_t   Port=2083; |  | ||||||
|         std::string     Secret{"radsec"}; |  | ||||||
|         std::string     OpenRoamingType; |  | ||||||
|         std::string     UseOpenRoamingAccount; |  | ||||||
|         std::uint64_t   Weight=0; |  | ||||||
|         std::string     Certificate; |  | ||||||
|         std::string     PrivateKey; |  | ||||||
|         std::vector<std::string>    CaCerts; |  | ||||||
|         bool AllowSelfSigned=false; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct RADIUSEndPoint { |  | ||||||
|         ObjectInfo                  info; |  | ||||||
|         std::string                 Type{"radius"}; |  | ||||||
|         std::string                 PoolStrategy{"none"}; |  | ||||||
|         bool                        UseGWProxy=true; |  | ||||||
|         std::string                 Index; |  | ||||||
|         std::vector<std::string>    UsedBy; |  | ||||||
|         std::vector<RADIUSEndPointRadiusType>   RadiusServers; |  | ||||||
|         std::vector<RADIUSEndPointRadsecType>   RadsecServers; |  | ||||||
|         std::string                 NasIdentifier; |  | ||||||
|         std::uint64_t               AccountingInterval=600; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct RADIUSEndpointUpdateStatus { |  | ||||||
|         std::uint64_t   lastUpdate=0; |  | ||||||
|         std::uint64_t   lastConfigurationChange=0; |  | ||||||
|  |  | ||||||
|         void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|         bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|         bool Read(); |  | ||||||
|         bool Save(); |  | ||||||
|         bool ChangeConfiguration(); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| }; // namespace OpenWifi::ProvObjects |  | ||||||
|   | |||||||
| @@ -9,11 +9,11 @@ | |||||||
| #include "Poco/JSON/Parser.h" | #include "Poco/JSON/Parser.h" | ||||||
| #include "Poco/JSON/Stringifier.h" | #include "Poco/JSON/Stringifier.h" | ||||||
|  |  | ||||||
| #include "RESTAPI_SecurityObjects.h" |  | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  | #include "RESTAPI_SecurityObjects.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  |  | ||||||
| namespace OpenWifi::SecurityObjects { | namespace OpenWifi::SecurityObjects { | ||||||
|  |  | ||||||
| @@ -26,37 +26,24 @@ namespace OpenWifi::SecurityObjects { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ResourceAccessType ResourceAccessTypeFromString(const std::string &s) { | 	ResourceAccessType ResourceAccessTypeFromString(const std::string &s) { | ||||||
| 		if (!Poco::icompare(s, "READ")) | 		if(!Poco::icompare(s,"READ")) return READ; | ||||||
| 			return READ; | 		if(!Poco::icompare(s,"MODIFY")) return MODIFY; | ||||||
| 		if (!Poco::icompare(s, "MODIFY")) | 		if(!Poco::icompare(s,"DELETE")) return DELETE; | ||||||
| 			return MODIFY; | 		if(!Poco::icompare(s,"CREATE")) return CREATE; | ||||||
| 		if (!Poco::icompare(s, "DELETE")) | 		if(!Poco::icompare(s,"TEST")) return TEST; | ||||||
| 			return DELETE; | 		if(!Poco::icompare(s,"MOVE")) return MOVE; | ||||||
| 		if (!Poco::icompare(s, "CREATE")) |  | ||||||
| 			return CREATE; |  | ||||||
| 		if (!Poco::icompare(s, "TEST")) |  | ||||||
| 			return TEST; |  | ||||||
| 		if (!Poco::icompare(s, "MOVE")) |  | ||||||
| 			return MOVE; |  | ||||||
| 		return NONE; | 		return NONE; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	std::string ResourceAccessTypeToString(const ResourceAccessType & T) { | 	std::string ResourceAccessTypeToString(const ResourceAccessType & T) { | ||||||
| 		switch(T) { | 		switch(T) { | ||||||
| 		case READ: | 		case READ: return "READ"; | ||||||
| 			return "READ"; | 		case MODIFY: return "MODIFY"; | ||||||
| 		case MODIFY: | 		case DELETE: return "DELETE"; | ||||||
| 			return "MODIFY"; | 		case CREATE: return "CREATE"; | ||||||
| 		case DELETE: | 		case TEST: return "TEST"; | ||||||
| 			return "DELETE"; | 		case MOVE: return "MOVE"; | ||||||
| 		case CREATE: | 		default: return "NONE"; | ||||||
| 			return "CREATE"; |  | ||||||
| 		case TEST: |  | ||||||
| 			return "TEST"; |  | ||||||
| 		case MOVE: |  | ||||||
| 			return "MOVE"; |  | ||||||
| 		default: |  | ||||||
| 			return "NONE"; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -84,24 +71,15 @@ namespace OpenWifi::SecurityObjects { | |||||||
|  |  | ||||||
|     std::string UserTypeToString(USER_ROLE U) { |     std::string UserTypeToString(USER_ROLE U) { | ||||||
|         switch(U) { |         switch(U) { | ||||||
| 		case ROOT: |             case ROOT: return "root"; | ||||||
| 			return "root"; |             case ADMIN: return "admin"; | ||||||
| 		case ADMIN: |             case SUBSCRIBER: return "subscriber"; | ||||||
| 			return "admin"; |             case PARTNER: return "partner"; | ||||||
| 		case SUBSCRIBER: |             case CSR: return "csr"; | ||||||
| 			return "subscriber"; |             case SYSTEM: return "system"; | ||||||
| 		case PARTNER: |             case INSTALLER: return "installer"; | ||||||
| 			return "partner"; |             case NOC: return "noc"; | ||||||
| 		case CSR: |             case ACCOUNTING: return "accounting"; | ||||||
| 			return "csr"; |  | ||||||
| 		case SYSTEM: |  | ||||||
| 			return "system"; |  | ||||||
| 		case INSTALLER: |  | ||||||
| 			return "installer"; |  | ||||||
| 		case NOC: |  | ||||||
| 			return "noc"; |  | ||||||
| 		case ACCOUNTING: |  | ||||||
| 			return "accounting"; |  | ||||||
|             case UNKNOWN: |             case UNKNOWN: | ||||||
|             default: |             default: | ||||||
|                 return "unknown"; |                 return "unknown"; | ||||||
| @@ -247,6 +225,7 @@ namespace OpenWifi::SecurityObjects { | |||||||
|             std::cout << "Cannot parse: MFAChallengeResponse" << std::endl; |             std::cout << "Cannot parse: MFAChallengeResponse" << std::endl; | ||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void UserInfo::to_json(Poco::JSON::Object &Obj) const { |     void UserInfo::to_json(Poco::JSON::Object &Obj) const { | ||||||
| @@ -452,12 +431,9 @@ namespace OpenWifi::SecurityObjects { | |||||||
| 	    try { | 	    try { | ||||||
| 	        if(Obj->has("notes") && Obj->isArray("notes")) { | 	        if(Obj->has("notes") && Obj->isArray("notes")) { | ||||||
| 	            SecurityObjects::NoteInfoVec NIV; | 	            SecurityObjects::NoteInfoVec NIV; | ||||||
| 				NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>( | 	            NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString()); | ||||||
| 					Obj->get("notes").toString()); |  | ||||||
| 	            for(auto const &i:NIV) { | 	            for(auto const &i:NIV) { | ||||||
| 					SecurityObjects::NoteInfo ii{.created = (uint64_t)Utils::Now(), | 	                SecurityObjects::NoteInfo   ii{.created=(uint64_t)Utils::Now(), .createdBy=UInfo.email, .note=i.note}; | ||||||
| 												 .createdBy = UInfo.email, |  | ||||||
| 												 .note = i.note}; |  | ||||||
| 	                Notes.push_back(ii); | 	                Notes.push_back(ii); | ||||||
| 	            } | 	            } | ||||||
| 	        } | 	        } | ||||||
| @@ -468,11 +444,9 @@ namespace OpenWifi::SecurityObjects { | |||||||
| 	    return false; | 	    return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	bool MergeNotes(const NoteInfoVec &NewNotes, const UserInfo &UInfo, | 	bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes) { | ||||||
| 					NoteInfoVec &ExistingNotes) { |  | ||||||
| 	    for(auto const &i:NewNotes) { | 	    for(auto const &i:NewNotes) { | ||||||
| 			SecurityObjects::NoteInfo ii{ | 	        SecurityObjects::NoteInfo   ii{.created=(uint64_t)Utils::Now(), .createdBy=UInfo.email, .note=i.note}; | ||||||
| 				.created = (uint64_t)Utils::Now(), .createdBy = UInfo.email, .note = i.note}; |  | ||||||
| 	        ExistingNotes.push_back(ii); | 	        ExistingNotes.push_back(ii); | ||||||
| 	    } | 	    } | ||||||
|         return true; |         return true; | ||||||
| @@ -486,8 +460,7 @@ namespace OpenWifi::SecurityObjects { | |||||||
| 	bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) { | 	bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) { | ||||||
| 		try { | 		try { | ||||||
| 			field_from_json(Obj,"resource",resource); | 			field_from_json(Obj,"resource",resource); | ||||||
| 			field_from_json<ResourceAccessType>(Obj, "access", access, | 			field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString ); | ||||||
| 												ResourceAccessTypeFromString); |  | ||||||
| 			return true; | 			return true; | ||||||
| 		} catch(...) { | 		} catch(...) { | ||||||
|             std::cout << "Cannot parse: ProfileAction" << std::endl; |             std::cout << "Cannot parse: ProfileAction" << std::endl; | ||||||
| @@ -721,20 +694,5 @@ namespace OpenWifi::SecurityObjects { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void ExtraSystemConfiguration::to_json(Poco::JSON::Object &Obj) const { |  | ||||||
|         field_to_json(Obj, "parameterName", parameterName); |  | ||||||
|         field_to_json(Obj, "parameterValue", parameterValue); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|     bool ExtraSystemConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) { |  | ||||||
|         try { |  | ||||||
|             field_from_json(Obj, "parameterName", parameterName); |  | ||||||
|             field_from_json(Obj, "parameterValue", parameterValue); |  | ||||||
|             return true; |  | ||||||
|         } catch (...) { |  | ||||||
|             std::cout << "Cannot parse: Token" << std::endl; |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } // namespace OpenWifi::SecurityObjects |  | ||||||
|   | |||||||
| @@ -8,13 +8,13 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "Poco/Data/LOB.h" |  | ||||||
| #include "Poco/Data/LOBStream.h" |  | ||||||
| #include "Poco/JSON/Object.h" |  | ||||||
| #include "framework/OpenWifiTypes.h" |  | ||||||
| #include "framework/utils.h" |  | ||||||
| #include <string> | #include <string> | ||||||
| #include <type_traits> | #include <type_traits> | ||||||
|  | #include "framework/OpenWifiTypes.h" | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  | #include "Poco/Data/LOB.h" | ||||||
|  | #include "Poco/Data/LOBStream.h" | ||||||
|  | #include "framework/utils.h" | ||||||
|  |  | ||||||
| namespace OpenWifi { | namespace OpenWifi { | ||||||
|     uint64_t Now(); |     uint64_t Now(); | ||||||
| @@ -56,16 +56,7 @@ namespace OpenWifi { | |||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         enum USER_ROLE { |         enum USER_ROLE { | ||||||
| 			UNKNOWN, |             UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING, PARTNER | ||||||
| 			ROOT, |  | ||||||
| 			ADMIN, |  | ||||||
| 			SUBSCRIBER, |  | ||||||
| 			CSR, |  | ||||||
| 			SYSTEM, |  | ||||||
| 			INSTALLER, |  | ||||||
| 			NOC, |  | ||||||
| 			ACCOUNTING, |  | ||||||
| 			PARTNER |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         USER_ROLE UserTypeFromString(const std::string &U); |         USER_ROLE UserTypeFromString(const std::string &U); | ||||||
| @@ -171,11 +162,9 @@ namespace OpenWifi { | |||||||
|             bool from_json(const Poco::JSON::Object::Ptr &Obj); |             bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
| 		// bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & |         // bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); | ||||||
| 		// Notes); |  | ||||||
|         bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); |         bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); | ||||||
| 		bool MergeNotes(const NoteInfoVec &NewNotes, const UserInfo &UInfo, |         bool MergeNotes(const NoteInfoVec & NewNotes, const UserInfo &UInfo, NoteInfoVec & ExistingNotes); | ||||||
| 						NoteInfoVec &ExistingNotes); |  | ||||||
|  |  | ||||||
|         struct InternalServiceInfo { |         struct InternalServiceInfo { | ||||||
|             std::string privateURI; |             std::string privateURI; | ||||||
| @@ -219,7 +208,15 @@ namespace OpenWifi { | |||||||
|         }; |         }; | ||||||
|         typedef std::map<std::string,SecurityObjects::UserInfoAndPolicy>	UserInfoCache; |         typedef std::map<std::string,SecurityObjects::UserInfoAndPolicy>	UserInfoCache; | ||||||
|  |  | ||||||
| 		enum ResourceAccessType { NONE, READ, MODIFY, DELETE, CREATE, TEST, MOVE }; |         enum ResourceAccessType { | ||||||
|  |             NONE, | ||||||
|  |             READ, | ||||||
|  |             MODIFY, | ||||||
|  |             DELETE, | ||||||
|  |             CREATE, | ||||||
|  |             TEST, | ||||||
|  |             MOVE | ||||||
|  |         }; | ||||||
|  |  | ||||||
|         ResourceAccessType ResourceAccessTypeFromString(const std::string &s); |         ResourceAccessType ResourceAccessTypeFromString(const std::string &s); | ||||||
|         std::string ResourceAccessTypeToString(const ResourceAccessType & T); |         std::string ResourceAccessTypeToString(const ResourceAccessType & T); | ||||||
| @@ -367,13 +364,5 @@ namespace OpenWifi { | |||||||
|             bool from_json(const Poco::JSON::Object::Ptr &Obj); |             bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         struct ExtraSystemConfiguration { |     } | ||||||
|             std::string     parameterName; | } | ||||||
|             std::string     parameterValue; |  | ||||||
|  |  | ||||||
|             void to_json(Poco::JSON::Object &Obj) const; |  | ||||||
|             bool from_json(const Poco::JSON::Object::Ptr &Obj); |  | ||||||
|         }; |  | ||||||
|  |  | ||||||
| } // namespace SecurityObjects |  | ||||||
| } // namespace OpenWifi |  | ||||||
|   | |||||||
| @@ -5,8 +5,8 @@ | |||||||
| #include "RESTAPI_SubObjects.h" | #include "RESTAPI_SubObjects.h" | ||||||
| #include "framework/RESTAPI_utils.h" | #include "framework/RESTAPI_utils.h" | ||||||
|  |  | ||||||
| using OpenWifi::RESTAPI_utils::field_from_json; |  | ||||||
| using OpenWifi::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
|  | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  |  | ||||||
| namespace OpenWifi::SubObjects { | namespace OpenWifi::SubObjects { | ||||||
|  |  | ||||||
| @@ -599,4 +599,4 @@ namespace OpenWifi::SubObjects { | |||||||
|         } |         } | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| } // namespace OpenWifi::SubObjects | } | ||||||
| @@ -317,6 +317,6 @@ namespace OpenWifi::SubObjects { | |||||||
|         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); | ||||||
|     }; |     }; | ||||||
| } // namespace OpenWifi::SubObjects | } | ||||||
|  |  | ||||||
| #endif //OWSUB_RESTAPI_SUBOBJECTS_H | #endif //OWSUB_RESTAPI_SUBOBJECTS_H | ||||||
|   | |||||||
| @@ -10,8 +10,7 @@ | |||||||
|  |  | ||||||
| namespace OpenWifi::SDK::GW { | namespace OpenWifi::SDK::GW { | ||||||
|  |  | ||||||
| 	bool SendFirmwareUpgradeCommand(const std::string &serialNumber, const std::string &URI, |     bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, [[maybe_unused]] uint64_t When  ) { | ||||||
| 									[[maybe_unused]] uint64_t When) { |  | ||||||
|         Types::StringPairVec    QueryData; |         Types::StringPairVec    QueryData; | ||||||
|         Poco::JSON::Object      Body; |         Poco::JSON::Object      Body; | ||||||
|  |  | ||||||
| @@ -20,8 +19,10 @@ namespace OpenWifi::SDK::GW { | |||||||
|         Body.set("when",0); |         Body.set("when",0); | ||||||
|  |  | ||||||
|         OpenWifi::OpenAPIRequestPost R(OpenWifi::uSERVICE_GATEWAY, |         OpenWifi::OpenAPIRequestPost R(OpenWifi::uSERVICE_GATEWAY, | ||||||
| 									   "/api/v1/device/" + serialNumber + "/upgrade", QueryData, |                                        "/api/v1/device/" + serialNumber + "/upgrade" , | ||||||
| 									   Body, 10000); |                                       QueryData, | ||||||
|  |                                       Body, | ||||||
|  |                                       10000); | ||||||
|         Poco::JSON::Object::Ptr Response; |         Poco::JSON::Object::Ptr Response; | ||||||
|         if(R.Do(Response) == Poco::Net::HTTPResponse::HTTP_OK) { |         if(R.Do(Response) == Poco::Net::HTTPResponse::HTTP_OK) { | ||||||
|             std::ostringstream os; |             std::ostringstream os; | ||||||
| @@ -37,4 +38,4 @@ namespace OpenWifi::SDK::GW { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi::SDK::GW | } | ||||||
| @@ -8,7 +8,7 @@ | |||||||
|  |  | ||||||
| namespace OpenWifi::SDK::GW { | namespace OpenWifi::SDK::GW { | ||||||
|  |  | ||||||
| 	bool SendFirmwareUpgradeCommand(const std::string &serialNumber, const std::string &URI, |     bool SendFirmwareUpgradeCommand( const std::string & serialNumber, const std::string & URI, uint64_t When = 0 ); | ||||||
| 									uint64_t When = 0); |  | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,8 +2,8 @@ | |||||||
| // Created by stephane bourque on 2021-10-04. | // Created by stephane bourque on 2021-10-04. | ||||||
| // | // | ||||||
|  |  | ||||||
| #include "framework/MicroServiceNames.h" |  | ||||||
| #include "framework/OpenAPIRequests.h" | #include "framework/OpenAPIRequests.h" | ||||||
|  | #include "framework/MicroServiceNames.h" | ||||||
|  |  | ||||||
| namespace OpenWifi::SDK::Prov { | namespace OpenWifi::SDK::Prov { | ||||||
|     bool GetFirmwareOptions( const std::string & serialNumber, std::string &firmwareUpgrade, |     bool GetFirmwareOptions( const std::string & serialNumber, std::string &firmwareUpgrade, | ||||||
| @@ -13,7 +13,9 @@ namespace OpenWifi::SDK::Prov { | |||||||
|         QueryData.push_back(std::make_pair("firmwareOptions","true")); |         QueryData.push_back(std::make_pair("firmwareOptions","true")); | ||||||
|  |  | ||||||
|         OpenWifi::OpenAPIRequestGet R(  OpenWifi::uSERVICE_PROVISIONING, |         OpenWifi::OpenAPIRequestGet R(  OpenWifi::uSERVICE_PROVISIONING, | ||||||
| 									  "/api/v1/inventory/" + serialNumber, QueryData, 10000); |                                         "/api/v1/inventory/" +serialNumber, | ||||||
|  |                                       QueryData, | ||||||
|  |                                       10000); | ||||||
|         firmwareUpgrade="no"; |         firmwareUpgrade="no"; | ||||||
|         firmwareRCOnly=false; |         firmwareRCOnly=false; | ||||||
|         Poco::JSON::Object::Ptr Response; |         Poco::JSON::Object::Ptr Response; | ||||||
| @@ -38,4 +40,4 @@ namespace OpenWifi::SDK::Prov { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace OpenWifi::SDK::Prov | } | ||||||