Compare commits

...

99 Commits

Author SHA1 Message Date
TIP Automation User
83211baba8 Chg: update image tag in helm values to v2.4.0-RC5 2021-12-08 07:42:39 +00:00
Dmitry Dunaev
9b87fb756f Add: .git dir to build image to expose git hash for version
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-12-08 10:26:22 +03:00
stephb9959
1064bfe137 Merge remote-tracking branch 'origin/release/v2.4.0' into release/v2.4.0 2021-12-06 09:06:40 -08:00
stephb9959
5125dc5eb6 Adding git hash - no Jira: display git hash in the systeminfo version. 2021-12-06 09:06:28 -08:00
Dmitry Dunaev
ec1acd922d Chg: helm values image tag to v2.4.0-RC4 2021-12-03 12:00:48 +03:00
stephb9959
6a29facd59 Merge remote-tracking branch 'origin/release/v2.4.0' into release/v2.4.0 2021-12-02 10:10:26 -08:00
stephb9959
aef76b12e4 Fix for: https://telecominfraproject.atlassian.net/browse/WIFI-6014 2021-12-02 10:10:15 -08:00
Dmitry Dunaev
1f2aaa94ba Chg: helm values image tag to v2.4.0-RC3
Signed-off-by: Dmitry Dunaev <dmitry@opsfleet.com>
2021-11-30 15:37:18 +03:00
stephb9959
2f4ff94280 Fix for: https://telecominfraproject.atlassian.net/browse/WIFI-5981 2021-11-29 09:50:19 -08:00
stephb9959
26ac5b836e Fix for: https://telecominfraproject.atlassian.net/browse/WIFI-5965 2021-11-29 09:32:48 -08:00
Dmitry Dunaev
e2508846b3 Bkpr: backport dependencies required for unsafe sysctls (WIFI-5420) 2021-11-22 15:50:51 +03:00
Dmitry Dunaev
2d8ee9b033 Chg: helm image in values to new release candidate 2021-11-22 14:53:01 +03:00
stephb9959
bf3ba546b6 Solving https://telecominfraproject.atlassian.net/browse/WIFI-5780 2021-11-18 21:00:58 -08:00
Leonid Mirsky
8b282a032c Update Helm values to v2.4.0-RC1
Signed-off-by: Leonid Mirsky <leonid@opsfleet.com>
2021-11-16 23:24:46 +02:00
stephb9959
4aa9e93d8a New UUIDv4 Generator 2021-11-15 11:26:56 -08:00
stephb9959
515f6cdf91 New UUIDv4 Generator 2021-11-15 10:58:29 -08:00
stephb9959
9d91b15110 Refactoring StorageArchiver 2021-11-14 23:47:31 -08:00
stephb9959
c73aba6ad4 Refactoring StorageArchiver 2021-11-14 23:40:43 -08:00
stephb9959
15fcd30030 Refactoring StorageArchiver 2021-11-14 23:26:30 -08:00
stephb9959
6fa4432f74 Refactoring StorageArchiver 2021-11-14 23:12:49 -08:00
stephb9959
c1367ddf3b Refactoring StorageArchiver 2021-11-14 23:08:07 -08:00
stephb9959
d80f146877 Refactoring StorageArchiver 2021-11-14 22:54:37 -08:00
stephb9959
e43b032d3a Refactoring StorageArchiver 2021-11-14 22:52:55 -08:00
stephb9959
b84ad117cf Refactoring StorageArchiver 2021-11-14 22:48:00 -08:00
stephb9959
03d29c4bd8 Fixed shutdown crash. 2021-11-14 13:50:25 -08:00
stephb9959
2344cea825 Debugging system exit 2021-11-14 13:48:23 -08:00
stephb9959
b431dc1293 Debugging system exit 2021-11-14 13:43:24 -08:00
stephb9959
566368638a Debugging system exit 2021-11-14 13:37:37 -08:00
stephb9959
957f1fe7d8 Debugging system exit 2021-11-14 13:22:00 -08:00
stephb9959
570f9de425 Debugging system exit 2021-11-14 11:29:44 -08:00
stephb9959
4121f70315 Debugging system exit 2021-11-14 11:23:33 -08:00
stephb9959
fec45de4e8 Debugging system exit 2021-11-14 11:16:49 -08:00
stephb9959
f981513ee2 Debugging system exit 2021-11-14 11:08:06 -08:00
stephb9959
e997eac63c Debugging system exit 2021-11-14 10:57:55 -08:00
stephb9959
736f9aa099 Debugging system exit 2021-11-14 10:31:44 -08:00
stephb9959
1e3711f293 Debugging system exit 2021-11-14 10:10:02 -08:00
stephb9959
76eca308c9 Debugging system exit 2021-11-14 09:43:17 -08:00
stephb9959
7a77497522 Debugging system exit 2021-11-14 09:34:47 -08:00
stephb9959
dd04572aef Debugging system exit 2021-11-14 09:00:12 -08:00
stephb9959
d6a4ab86e7 Debugging system exit 2021-11-14 08:56:04 -08:00
stephb9959
1367b5a4a2 Debugging system exit 2021-11-14 08:42:35 -08:00
stephb9959
7dbc1476d8 Debugging system exit 2021-11-14 08:32:19 -08:00
stephb9959
63fc7055f8 Debugging system exit 2021-11-14 08:24:30 -08:00
stephb9959
1c61ad8798 Debugging system exit 2021-11-14 08:20:29 -08:00
stephb9959
8f641df7e4 Debugging system exit 2021-11-14 08:11:13 -08:00
stephb9959
8241a4f287 Debugging system exit 2021-11-14 07:47:22 -08:00
stephb9959
8008bac1af Debugging system exit 2021-11-14 07:43:03 -08:00
stephb9959
b1fe5bcd39 Debugging system exit 2021-11-14 07:38:50 -08:00
stephb9959
aacc230ff2 Debugging system exit 2021-11-14 07:33:19 -08:00
stephb9959
a6823b2e2c Fixing commands command and newestcommands. 2021-11-13 23:49:56 -08:00
stephb9959
756ee323a5 Fixing commands command and newestcommands. 2021-11-13 23:11:46 -08:00
stephb9959
5f0a432cdc Fixing commands command and newestcommands. 2021-11-13 23:02:36 -08:00
stephb9959
a7ee104828 Fixing commands command and newestcommands. 2021-11-13 22:50:12 -08:00
stephb9959
980564d945 Fixing commands command and newestcommands. 2021-11-13 22:45:15 -08:00
stephb9959
085e8b93ee Fixing commands command and newestcommands. 2021-11-13 22:41:14 -08:00
stephb9959
ffe85278f1 Fixing commands command and newestcommands. 2021-11-13 22:09:01 -08:00
stephb9959
240d94c687 Fixing commands command. 2021-11-13 22:03:50 -08:00
stephb9959
31466efde8 Fixing commands command. 2021-11-13 21:57:13 -08:00
stephb9959
aa9fd229b6 Fixing commands command. 2021-11-13 21:54:18 -08:00
stephb9959
daf1563636 Framework update. 2021-11-13 15:23:34 -08:00
stephb9959
ac74dffd0c Framework update. 2021-11-12 23:36:20 -08:00
stephb9959
c85f22bfb5 Framework update. 2021-11-12 09:05:53 -08:00
stephb9959
126b391080 Framework update. 2021-11-11 20:36:41 -08:00
stephb9959
48b2c57245 Merge remote-tracking branch 'origin/master' 2021-11-11 17:57:15 -08:00
stephb9959
c82126234d Framework update. 2021-11-11 17:57:04 -08:00
Max
d9488cdd79 Revert "[WIFI-5420] Add: helm sysctl for tcp keepalive" (#62) 2021-11-11 16:12:36 +01:00
Dmitry Dunaev
0745badb8a Merge pull request #61 from Telecominfraproject/feature/wifi-5420--add-sysctl-context
[WIFI-5420] Add: helm sysctl for tcp keepalive
2021-11-10 18:19:20 +03:00
Dmitry Dunaev
c13a6c1852 [WIFI-5420] Add: helm sysctl for tcp keepalive 2021-11-10 17:56:49 +03:00
stephb9959
053b9de558 Framework update. 2021-11-09 18:01:30 -08:00
stephb9959
6d058930c9 Framework update. 2021-11-09 17:25:16 -08:00
stephb9959
9e52c9d7da Merge remote-tracking branch 'origin/master' 2021-11-08 20:19:29 -08:00
stephb9959
7fbdc4b18b Fixing some static singleton instantiation 2021-11-08 20:19:13 -08:00
Stephane Bourque
d2ce73f75e Merge pull request #60 from Telecominfraproject/WIFI-5407-add-pod-annotations
allow to set pod annotations
2021-11-06 23:17:30 -07:00
stephb9959
8bfd0f57ab Added bulk deletion for an OUI 2021-11-06 10:28:14 -07:00
stephb9959
66c17e7691 Added bulk deletion for an OUI 2021-11-06 10:25:10 -07:00
stephb9959
05b7be1270 Added bulk deletion for an OUI 2021-11-06 10:21:18 -07:00
stephb9959
57c11d9a09 Added bulk deletion for an OUI 2021-11-06 10:17:26 -07:00
stephb9959
5664dbef6d Remove all traces of a device when deleting. 2021-11-06 08:55:33 -07:00
stephb9959
874cd297b1 Remove all traces of a device when deleting. 2021-11-05 18:31:25 -07:00
Max Brenner
cef65da7d8 allow to set pod annotations 2021-11-05 14:43:14 +01:00
stephb9959
c7bb51e73f Adding the ability to support OWLS. 2021-11-03 23:20:03 -07:00
stephb9959
cfc9422266 Closing the socket after a WebSocket session from the UI. 2021-11-01 15:39:54 -07:00
stephb9959
e15f3af410 Fixing state processor for radio associations processing. 2021-10-31 00:17:18 -07:00
stephb9959
c1797d9caf Testing stateprocessor 2021-10-31 00:07:34 -07:00
stephb9959
ddc26b7e08 Testing stateprocessor 2021-10-30 23:55:21 -07:00
stephb9959
1ba31d3480 Testing stateprocessor 2021-10-30 23:51:45 -07:00
stephb9959
b38043c02d Testing stateprocessor 2021-10-30 23:48:51 -07:00
stephb9959
bc5b430c2e Testing stateprocessor 2021-10-30 23:36:53 -07:00
stephb9959
03503cc525 Testing stateprocessor 2021-10-30 23:29:22 -07:00
stephb9959
310cdd6245 Fixing ConfigurationValidator 2021-10-30 15:38:54 -07:00
stephb9959
5f089105b7 Fixing ConfigurationValidator 2021-10-30 15:34:02 -07:00
stephb9959
3548c004cb Adding better parallel processing for telemetry. 2021-10-30 12:32:12 -07:00
stephb9959
f9f1101ac9 Adding better parallel processing for telemetry. 2021-10-30 12:30:05 -07:00
stephb9959
1f8294a208 Adding better parallel processing for telemetry. 2021-10-30 11:47:36 -07:00
stephb9959
6b2e3db363 Adding better parallel processing for telemetry. 2021-10-30 11:40:21 -07:00
stephb9959
8faa8a82fd Adding better parallel processing for telemetry. 2021-10-30 11:32:58 -07:00
stephb9959
24bb3fc2f6 Adding better parallel processing for telemetry. 2021-10-30 11:22:07 -07:00
stephb9959
38dd9f592a Adding better parallel processing for telemetry. 2021-10-30 11:04:00 -07:00
stephb9959
bb176c23bb Fixing sanity check dashboard miscalculation. Fixing telemetry for multiple client on same device.
Fixing CLI syntax mistake.
2021-10-30 10:01:36 -07:00
55 changed files with 1936 additions and 978 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.13)
project(owgw VERSION 2.3.0)
project(owgw VERSION 2.4.0)
set(CMAKE_CXX_STANDARD 17)
@@ -29,7 +29,20 @@ else()
set(BUILD_NUM 1)
file(WRITE build ${BUILD_NUM})
endif()
add_definitions(-DAPP_VERSION="${CMAKE_PROJECT_VERSION}" -DBUILD_NUMBER="${BUILD_NUM}")
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_HASH)
if(NOT GIT_RESULT EQUAL "0")
message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}")
endif()
string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
endif()
add_definitions(-DAWS_CUSTOM_MEMORY_MANAGEMENT)
add_definitions(-DTIP_GATEWAY_SERVICE="1")
set(Boost_USE_STATIC_LIBS OFF)
@@ -52,8 +65,11 @@ endif()
include_directories(/usr/local/include /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
add_executable( owgw
build
src/ow_version.h.in
src/framework/CountryCodes.h
src/framework/KafkaTopics.h
src/framework/MicroService.h
@@ -102,7 +118,7 @@ add_executable( owgw
src/Dashboard.cpp src/Dashboard.h
src/SerialNumberCache.cpp src/SerialNumberCache.h
src/TelemetryStream.cpp src/TelemetryStream.h
src/ConfigurationValidator.cpp src/ConfigurationValidator.h
src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
src/ConfigurationCache.cpp src/ConfigurationCache.h
)

View File

@@ -38,6 +38,7 @@ RUN make install
ADD CMakeLists.txt build /owgw/
ADD cmake /owgw/cmake
ADD src /owgw/src
ADD .git /owgw/.git
WORKDIR /owgw
RUN mkdir cmake-build

View File

@@ -26,9 +26,9 @@ Poco may take several minutes depending on the platform you are building on.
### Ubuntu
These instructions have proven to work on Ubuntu 20.4.
```
sudo apt install git cmake g++ libssl-dev libmariadb-dev unixodbc-dev
sudo apt install git cmake g++ libssl-dev libmariadb-dev
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
sudo apt install librdkafka-dev liblua5.3-dev libmysqlclient-dev
sudo apt install librdkafka-dev libmysqlclient-dev default-libmysqlclient-dev
git clone https://github.com/stephb9959/poco
cd poco

2
build
View File

@@ -1 +1 @@
8
42

View File

@@ -24,6 +24,12 @@ spec:
metadata:
annotations:
checksum/config: {{ include "owgw.config" . | sha256sum }}
{{- if .Values.podSecurityPolicy.enabled }}
kubernetes.io/psp: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
{{- end }}
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
app.kubernetes.io/name: {{ include "owgw.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}

28
helm/templates/psp.yaml Normal file
View File

@@ -0,0 +1,28 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
labels:
app.kubernetes.io/name: {{ include "owgw.name" . }}
helm.sh/chart: {{ include "owgw.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
allowedUnsafeSysctls:
{{- range $unsafeSysctl := .Values.securityContext.sysctls }}
- {{ $unsafeSysctl.name }}
{{- end }}
privileged: false
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
{{- end }}

16
helm/templates/role.yaml Normal file
View File

@@ -0,0 +1,16 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
rules:
- apiGroups:
- policy
resources:
- podsecuritypolicies
verbs:
- use
resourceNames:
- {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
{{- end }}

View File

@@ -0,0 +1,15 @@
{{- if .Values.podSecurityPolicy.enabled }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl-to-default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
subjects:
- kind: ServiceAccount
name: default
namespace: {{ .Release.Namespace }}
{{- end }}

View File

@@ -8,7 +8,7 @@ fullnameOverride: ""
images:
owgw:
repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
tag: master
tag: v2.4.0-RC5
pullPolicy: Always
# regcred:
# registry: tip-tip-wlan-cloud-ucentral.jfrog.io
@@ -112,6 +112,17 @@ resources: {}
securityContext:
fsGroup: 101
# Usage of unsafe sysctls requires multiple things:
# - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag)
# - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below
# - uncommenting parameters below
#sysctls:
#- name: net.ipv4.tcp_keepalive_intvl
# value: "5"
#- name: net.ipv4.tcp_keepalive_probes
# value: "2"
#- name: net.ipv4.tcp_keepalive_time
# value: "45"
nodeSelector: {}
@@ -119,6 +130,11 @@ tolerations: []
affinity: {}
podAnnotations: {}
podSecurityPolicy:
enabled: false
persistence:
enabled: true
# storageClassName: "-"

View File

@@ -51,6 +51,16 @@ components:
properties:
ErrorCode:
type: integer
enum:
- 0 # Success
- 1 # PASSWORD_CHANGE_REQUIRED,
- 2 # INVALID_CREDENTIALS,
- 3 # PASSWORD_ALREADY_USED,
- 4 # USERNAME_PENDING_VERIFICATION,
- 5 # PASSWORD_INVALID,
- 6 # INTERNAL_ERROR,
- 7 # ACCESS_DENIED,
- 8 # INVALID_TOKEN
ErrorDetails:
type: string
ErrorDescription:

View File

@@ -20,8 +20,6 @@
namespace OpenWifi {
class CommandManager * CommandManager::instance_ = nullptr;
void CommandManager::run() {
Running_ = true;
while(Running_)

View File

@@ -68,15 +68,12 @@ namespace OpenWifi {
bool GetCommand(uint64_t Id, const std::string & SerialNumber, CommandTag &T);
static CommandManager *instance() {
if (instance_ == nullptr) {
instance_ = new CommandManager;
}
static CommandManager *instance_ = new CommandManager;
return instance_;
}
inline bool Running() const { return Running_; }
private:
static CommandManager * instance_;
std::atomic_bool Running_ = false;
Poco::Thread ManagerThread;
uint64_t Id_=2; // do not start @1. We ignore ID=1 & 0 is illegal..

View File

@@ -5,5 +5,4 @@
#include "ConfigurationCache.h"
namespace OpenWifi {
class ConfigurationCache * ConfigurationCache::instance_ = nullptr;
}

View File

@@ -13,10 +13,9 @@ namespace OpenWifi {
class ConfigurationCache {
public:
static ConfigurationCache &instance() {
if(instance_== nullptr)
instance_ = new ConfigurationCache;
return *instance_;
static ConfigurationCache & instance() {
static ConfigurationCache instance;
return instance;
}
inline uint64_t CurrentConfig(const std::string &SerialNumber) {
@@ -27,13 +26,12 @@ namespace OpenWifi {
return Hint->second;
}
void Add(const std::string &SerialNumber, uint64_t Id) {
inline void Add(const std::string &SerialNumber, uint64_t Id) {
std::lock_guard G(Mutex_);
Cache_[SerialNumber]=Id;
}
private:
static ConfigurationCache *instance_;
std::mutex Mutex_;
std::map<std::string,uint64_t> Cache_;
};

View File

@@ -11,10 +11,9 @@
#include "Poco/Util/Option.h"
#include "Poco/Environment.h"
#include "Daemon.h"
#include "CentralConfig.h"
#include "CommandManager.h"
#include "ConfigurationValidator.h"
#include "Daemon.h"
#include "DeviceRegistry.h"
#include "FileUploader.h"
#include "OUIServer.h"
@@ -23,14 +22,12 @@
#include "StorageService.h"
#include "TelemetryStream.h"
#include "WebSocketServer.h"
#include "framework/ConfigurationValidator.h"
#include "framework/MicroService.h"
namespace OpenWifi {
class Daemon *Daemon::instance_ = nullptr;
class Daemon *Daemon::instance() {
if (instance_ == nullptr) {
instance_ = new Daemon(vDAEMON_PROPERTIES_FILENAME,
static Daemon instance(vDAEMON_PROPERTIES_FILENAME,
vDAEMON_ROOT_ENV_VAR,
vDAEMON_CONFIG_ENV_VAR,
vDAEMON_APP_NAME,
@@ -47,8 +44,7 @@ namespace OpenWifi {
StorageArchiver(),
TelemetryStream()
});
}
return instance_;
return &instance;
}
void Daemon::initialize() {
@@ -95,10 +91,9 @@ namespace OpenWifi {
int main(int argc, char **argv) {
try {
auto App = OpenWifi::Daemon::instance();
auto ExitCode = App->run(argc, argv);
delete App;
return ExitCode;
} catch (Poco::Exception &exc) {

View File

@@ -54,7 +54,6 @@ namespace OpenWifi {
inline DeviceDashboard & GetDashboard() { return DB_; }
Poco::Logger & Log() { return Poco::Logger::get(AppName()); }
private:
static Daemon *instance_;
bool AutoProvisioning_ = false;
Types::StringMapStringSet DeviceTypeIdentifications_;
DeviceDashboard DB_;

View File

@@ -11,15 +11,9 @@
#include "DeviceRegistry.h"
#include "WebSocketServer.h"
#include "framework/MicroService.h"
#include "OUIServer.h"
namespace OpenWifi {
class DeviceRegistry *DeviceRegistry::instance_ = nullptr;
DeviceRegistry::DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
int DeviceRegistry::Start() {
std::lock_guard Guard(Mutex_);
@@ -47,7 +41,6 @@ namespace OpenWifi {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->Conn_.LastContact = time(nullptr);
@@ -90,68 +83,47 @@ namespace OpenWifi {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device != Devices_.end())
{
Device->second->LastHealthcheck = CheckData;
}
}
GWObjects::ConnectionState * DeviceRegistry::Register(const std::string & SerialNumber, WSConnection *Ptr)
std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(const std::string & SerialNumber, WSConnection *Ptr, uint64_t & ConnectionId )
{
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if( Device == Devices_.end()) {
auto E = std::make_unique<ConnectionEntry>();
E->WSConn_ = Ptr;
E->Conn_.SerialNumber = SerialNumber;
E->Conn_.LastContact = std::time(nullptr);
E->Conn_.Connected = true ;
E->Conn_.UUID = 0 ;
E->Conn_.MessageCount = 0 ;
E->Conn_.Address = "";
E->Conn_.TX = 0 ;
E->Conn_.RX = 0;
E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
auto R=&E->Conn_;
Devices_[SerialNumber] = std::move(E);
return R;
}
else
{
Device->second->WSConn_ = Ptr;
Device->second->Conn_.Connected = true;
Device->second->Conn_.LastContact = std::time(nullptr);
Device->second->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
return &Device->second->Conn_;
}
const auto & E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
E->WSConn_ = Ptr;
E->Conn_.SerialNumber = SerialNumber;
E->Conn_.LastContact = std::time(nullptr);
E->Conn_.Connected = true ;
E->Conn_.UUID = 0 ;
E->Conn_.MessageCount = 0 ;
E->Conn_.Address = "";
E->Conn_.TX = 0 ;
E->Conn_.RX = 0;
E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
ConnectionId = E->ConnectionId = ++Id_;
return E;
}
bool DeviceRegistry::Connected(const std::string & SerialNumber) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if(Device == Devices_.end())
return false;
return Device->second->Conn_.Connected;
}
void DeviceRegistry::UnRegister(const std::string & SerialNumber, WSConnection *Ptr) {
void DeviceRegistry::UnRegister(const std::string & SerialNumber, uint64_t ConnectionId) {
std::lock_guard Guard(Mutex_);
auto Device = Devices_.find(SerialNumber);
if( Device != Devices_.end() && Device->second->WSConn_==Ptr) {
Device->second->Conn_.Address = "";
Device->second->WSConn_ = nullptr;
Device->second->Conn_.Connected = false;
Device->second->Conn_.VerifiedCertificate = GWObjects::NO_CERTIFICATE;
}
}
auto It = Devices_.find(SerialNumber);
if(It!=Devices_.end()) {
if(It->second->ConnectionId == ConnectionId)
Devices_.erase(SerialNumber);
}
}
bool DeviceRegistry::SendFrame(const std::string & SerialNumber, const std::string & Payload) {
std::lock_guard Guard(Mutex_);

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc.
//
#ifndef UCENTRAL_UDEVICEREGISTRY_H
#define UCENTRAL_UDEVICEREGISTRY_H
#pragma once
#include "Poco/JSON/Object.h"
@@ -26,12 +25,11 @@ namespace OpenWifi {
GWObjects::ConnectionState Conn_;
std::string LastStats;
GWObjects::HealthCheck LastHealthcheck;
uint64_t ConnectionId=0;
};
static DeviceRegistry *instance() {
if (instance_ == nullptr) {
instance_ = new DeviceRegistry;
}
static DeviceRegistry *instance_ = new DeviceRegistry;
return instance_;
}
@@ -43,24 +41,24 @@ namespace OpenWifi {
void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData);
void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H);
GWObjects::ConnectionState * Register(const std::string & SerialNumber, WSConnection *);
void UnRegister(const std::string & SerialNumber, WSConnection *);
std::shared_ptr<ConnectionEntry> Register(const std::string & SerialNumber, WSConnection *, uint64_t & ConnectionId);
void UnRegister(const std::string & SerialNumber, uint64_t ConnectionId);
bool SendCommand(GWObjects::CommandDetails & Command);
bool Connected(const std::string & SerialNumber);
bool SendFrame(const std::string & SerialNumber, const std::string & Payload);
void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID);
bool AnalyzeRegistry(GWObjects::Dashboard &D);
private:
static DeviceRegistry *instance_;
std::map<std::string,std::unique_ptr<ConnectionEntry>> Devices_;
inline static std::atomic_uint64_t Id_=1;
std::map<std::string,std::shared_ptr<ConnectionEntry>> Devices_;
DeviceRegistry() noexcept;
DeviceRegistry() noexcept:
SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
}
};
inline DeviceRegistry * DeviceRegistry() { return DeviceRegistry::instance(); }
} // namespace
#endif //UCENTRAL_UDEVICEREGISTRY_H

View File

@@ -25,7 +25,6 @@
#include "framework/MicroService.h"
namespace OpenWifi {
class FileUploader *FileUploader::instance_ = nullptr;
static const std::string URI_BASE{"/v1/upload/"};

View File

@@ -30,16 +30,13 @@ namespace OpenWifi {
const std::string & Path() { return Path_; };
static FileUploader *instance() {
if (instance_ == nullptr) {
instance_ = new FileUploader;
}
return instance_;
static FileUploader * instance_ = new FileUploader;
return instance_;
}
[[nodiscard]] inline uint64_t MaxSize() const { return MaxSize_; }
private:
static FileUploader *instance_;
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> Servers_;
Poco::ThreadPool Pool_;
std::string FullName_;

View File

@@ -18,7 +18,6 @@
#include "framework/MicroService.h"
namespace OpenWifi {
class OUIServer * OUIServer::instance_;
int OUIServer::Start() {
Running_=true;

View File

@@ -15,9 +15,7 @@ namespace OpenWifi {
typedef std::map<uint64_t,std::string> OUIMap;
static OUIServer *instance() {
if (instance_ == nullptr) {
instance_ = new OUIServer;
}
static OUIServer *instance_ = new OUIServer;
return instance_;
}
@@ -33,7 +31,6 @@ namespace OpenWifi {
[[nodiscard]] bool ProcessFile(const std::string &FileName, OUIMap &Map);
private:
static OUIServer * instance_;
uint64_t LastUpdate_ = 0 ;
bool ValidFile_=false;
OUIMap OUIs_;

View File

@@ -33,6 +33,11 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::Device TheDevice;
if(!StorageService()->GetDevice(SerialNumber_,TheDevice)) {
return NotFound();
}
if (Command_ == RESTAPI::Protocol::CAPABILITIES){
return GetCapabilities();
} else if (Command_ == RESTAPI::Protocol::LOGS) {
@@ -55,6 +60,12 @@ namespace OpenWifi {
if(!ValidateParameters()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::Device TheDevice;
if(!StorageService()->GetDevice(SerialNumber_,TheDevice)) {
return NotFound();
}
if (Command_ == RESTAPI::Protocol::CAPABILITIES) {
return DeleteCapabilities();
} else if (Command_ == RESTAPI::Protocol::LOGS){
@@ -72,6 +83,12 @@ namespace OpenWifi {
if(!ValidateParameters()) {
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
}
GWObjects::Device TheDevice;
if(!StorageService()->GetDevice(SerialNumber_,TheDevice)) {
return NotFound();
}
if (Command_ == RESTAPI::Protocol::PERFORM) {
return ExecuteCommand();
} else if (Command_ == RESTAPI::Protocol::CONFIGURE) {
@@ -204,7 +221,7 @@ void RESTAPI_device_commandHandler::Configure() {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentralProtocol::CONFIGURE;
Cmd.RunAt = When;
@@ -246,7 +263,7 @@ void RESTAPI_device_commandHandler::Upgrade() {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentralProtocol::UPGRADE;
Cmd.RunAt = When;
@@ -357,7 +374,7 @@ void RESTAPI_device_commandHandler::ExecuteCommand() {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = Command;
Cmd.Custom = 1;
@@ -397,7 +414,7 @@ void RESTAPI_device_commandHandler::Reboot() {
uint64_t When = GetWhen(Obj);
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentralProtocol::REBOOT;
Cmd.RunAt = When;
@@ -434,7 +451,7 @@ void RESTAPI_device_commandHandler::Factory() {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentralProtocol::FACTORY;
Cmd.RunAt = When;
@@ -480,7 +497,7 @@ void RESTAPI_device_commandHandler::LEDs() {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.Command = uCentralProtocol::LEDS;
Cmd.RunAt = When;
@@ -519,7 +536,7 @@ void RESTAPI_device_commandHandler::Trace() {
auto Network = GetS(RESTAPI::Protocol::NETWORK, Obj);
auto Interface = GetS(RESTAPI::Protocol::INTERFACE, Obj);
auto UUID = MicroService::instance().CreateUUID();
auto UUID = MicroService::CreateUUID();
auto URI = FileUploader()->FullName() + UUID;
GWObjects::CommandDetails Cmd;
@@ -567,7 +584,7 @@ void RESTAPI_device_commandHandler::WifiScan() {
(!Obj->has(RESTAPI::Protocol::BANDS) &&
!Obj->has(RESTAPI::Protocol::CHANNELS)))) {
bool Verbose = GetB(RESTAPI::Protocol::VERBOSE, Obj);
auto UUID = MicroService::instance().CreateUUID();
auto UUID = MicroService::CreateUUID();
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
@@ -618,7 +635,7 @@ void RESTAPI_device_commandHandler::EventQueue() {
auto Types = Obj->getArray(RESTAPI::Protocol::TYPES);
auto UUID = MicroService::instance().CreateUUID();
auto UUID = MicroService::CreateUUID();
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
@@ -664,7 +681,7 @@ void RESTAPI_device_commandHandler::MakeRequest() {
Cmd.SerialNumber = SerialNumber_;
Cmd.SubmittedBy = UserInfo_.webtoken.username_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.Command = uCentralProtocol::REQUEST;
Cmd.RunAt = When;
@@ -689,7 +706,7 @@ void RESTAPI_device_commandHandler::MakeRequest() {
if (MicroService::instance().ConfigGetString("rtty.enabled", "false") == "true") {
GWObjects::Device Device;
if (StorageService()->GetDevice(SerialNumber_, Device)) {
auto CommandUUID = MicroService::instance().CreateUUID();
auto CommandUUID = MicroService::CreateUUID();
GWObjects::RttySessionDetails Rtty{
.SerialNumber = SerialNumber_,

View File

@@ -9,12 +9,12 @@
#include "RESTAPI_device_handler.h"
#include "CentralConfig.h"
#include "ConfigurationCache.h"
#include "ConfigurationValidator.h"
#include "Poco/JSON/Parser.h"
#include "StorageService.h"
#include "framework/ConfigurationValidator.h"
#include "framework/MicroService.h"
#include "framework/RESTAPI_errors.h"
#include "framework/RESTAPI_protocol.h"
#include "framework/MicroService.h"
namespace OpenWifi {
void RESTAPI_device_handler::DoGet() {
@@ -41,9 +41,40 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::MissingSerialNumber);
}
if (StorageService()->DeleteDevice(SerialNumber)) {
std::string Arg;
if(HasParameter("oui",Arg) && Arg=="true" && SerialNumber.size()==6) {
std::set<std::string> Set;
std::vector<GWObjects::Device> Devices;
bool Done = false;
uint64_t Offset=1;
while(!Done) {
StorageService()->GetDevices(Offset,500,Devices);
for(const auto &i:Devices) {
if(i.SerialNumber.substr(0,6) == SerialNumber) {
Set.insert(i.SerialNumber);
}
}
if(Devices.size()<500)
Done=true;
Offset += Devices.size();
}
for(auto &i:Set) {
std::string SNum{i};
StorageService()->DeleteDevice(SNum);
}
return OK();
} else if (StorageService()->DeleteDevice(SerialNumber)) {
return OK();
}
NotFound();
}
@@ -62,8 +93,11 @@ namespace OpenWifi {
}
auto Config=Body->get("configuration").toString();
Poco::JSON::Object Answer;
auto Res = ValidateUCentralConfiguration(Config);
std::string Error;
auto Res = ValidateUCentralConfiguration(Config, Error);
Answer.set("valid",Res);
if(!Error.empty())
Answer.set("error",Error);
return ReturnObject(Answer);
}
@@ -82,7 +116,8 @@ namespace OpenWifi {
return BadRequest(RESTAPI::Errors::SerialNumberMismatch);
}
if(Device.Configuration.empty() || (!Device.Configuration.empty() && !ValidateUCentralConfiguration(Device.Configuration))) {
std::string Error;
if(Device.Configuration.empty() || (!Device.Configuration.empty() && !ValidateUCentralConfiguration(Device.Configuration,Error))) {
return BadRequest(RESTAPI::Errors::ConfigBlockInvalid);
}
@@ -124,7 +159,8 @@ namespace OpenWifi {
}
if(!NewDevice.Configuration.empty()) {
if (!ValidateUCentralConfiguration(NewDevice.Configuration)) {
std::string Error;
if (!ValidateUCentralConfiguration(NewDevice.Configuration, Error)) {
return BadRequest(RESTAPI::Errors::ConfigBlockInvalid);
}
Config::Config NewConfig(NewDevice.Configuration);

View File

@@ -46,7 +46,8 @@ namespace OpenWifi {
if(!Authenticated) {
std::string Frame{IncomingFrame.begin()};
auto Tokens = Utils::Split(Frame,':');
if(Tokens.size()==2 && AuthClient()->IsTokenAuthorized(Tokens[1], UserInfo_)) {
bool Expired=false;
if(Tokens.size()==2 && AuthClient()->IsAuthorized(Tokens[1], UserInfo_, Expired)) {
Authenticated=true;
std::string S{"Welcome! Bienvenue! Bienvenidos!"};
WS.sendFrame(S.c_str(),S.size());
@@ -74,6 +75,12 @@ namespace OpenWifi {
}
}
break;
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
Logger_.warning(Poco::format("CLOSE(%s): Client is closing its WS connection.", UserInfo_.userinfo.email));
Done=true;
}
break;
default:
{

View File

@@ -68,7 +68,7 @@ namespace OpenWifi::GWObjects {
#endif
}
bool Device::from_json(Poco::JSON::Object::Ptr Obj) {
bool Device::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"serialNumber",SerialNumber);
field_from_json(Obj,"deviceType",DeviceType);
@@ -147,7 +147,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"attachFile", AttachDate);
}
bool DefaultConfiguration::from_json(Poco::JSON::Object::Ptr Obj) {
bool DefaultConfiguration::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"name",Name);
field_from_json(Obj,"configuration",Configuration);
@@ -166,7 +166,7 @@ namespace OpenWifi::GWObjects {
field_to_json(Obj,"created", created);
}
bool BlackListedDevice::from_json(Poco::JSON::Object::Ptr Obj) {
bool BlackListedDevice::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"serialNumber",serialNumber);
field_from_json(Obj,"author",author);

View File

@@ -59,7 +59,7 @@ namespace OpenWifi::GWObjects {
std::string DevicePassword;
void to_json(Poco::JSON::Object &Obj) const;
void to_json_with_status(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
void Print() const;
};
@@ -116,7 +116,7 @@ namespace OpenWifi::GWObjects {
uint64_t Created;
uint64_t LastModified;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct CommandDetails {
@@ -147,7 +147,7 @@ namespace OpenWifi::GWObjects {
std::string author;
uint64_t created;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct RttySessionDetails {

View File

@@ -10,27 +10,30 @@
#include "RESTAPI_ProvObjects.h"
#include "framework/MicroService.h"
using OpenWifi::RESTAPI_utils::field_to_json;
using OpenWifi::RESTAPI_utils::field_from_json;
namespace OpenWifi::ProvObjects {
void ObjectInfo::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj,"id",id);
RESTAPI_utils::field_to_json(Obj,"name",name);
RESTAPI_utils::field_to_json(Obj,"description",description);
RESTAPI_utils::field_to_json(Obj,"created",created);
RESTAPI_utils::field_to_json(Obj,"modified",modified);
RESTAPI_utils::field_to_json(Obj,"notes",notes);
RESTAPI_utils::field_to_json(Obj,"tags",tags);
field_to_json(Obj,"id",id);
field_to_json(Obj,"name",name);
field_to_json(Obj,"description",description);
field_to_json(Obj,"created",created);
field_to_json(Obj,"modified",modified);
field_to_json(Obj,"notes",notes);
field_to_json(Obj,"tags",tags);
}
bool ObjectInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json(Obj,"id",id);
RESTAPI_utils::field_from_json(Obj,"name",name);
RESTAPI_utils::field_from_json(Obj,"description",description);
RESTAPI_utils::field_from_json(Obj,"created",created);
RESTAPI_utils::field_from_json(Obj,"modified",modified);
RESTAPI_utils::field_from_json(Obj,"notes",notes);
RESTAPI_utils::field_from_json(Obj,"tags",tags);
field_from_json(Obj,"id",id);
field_from_json(Obj,"name",name);
field_from_json(Obj,"description",description);
field_from_json(Obj,"created",created);
field_from_json(Obj,"modified",modified);
field_from_json(Obj,"notes",notes);
field_from_json(Obj,"tags",tags);
return true;
} catch(...) {
@@ -39,18 +42,18 @@ namespace OpenWifi::ProvObjects {
}
void ManagementPolicyEntry::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json( Obj,"users",users);
RESTAPI_utils::field_to_json( Obj,"resources",resources);
RESTAPI_utils::field_to_json( Obj,"access",access);
RESTAPI_utils::field_to_json( Obj,"policy",policy);
field_to_json( Obj,"users",users);
field_to_json( Obj,"resources",resources);
field_to_json( Obj,"access",access);
field_to_json( Obj,"policy",policy);
}
bool ManagementPolicyEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"users",users);
RESTAPI_utils::field_from_json( Obj,"resources",resources);
RESTAPI_utils::field_from_json( Obj,"access",access);
RESTAPI_utils::field_from_json( Obj,"policy",policy);
field_from_json( Obj,"users",users);
field_from_json( Obj,"resources",resources);
field_from_json( Obj,"access",access);
field_from_json( Obj,"policy",policy);
return true;
} catch(...) {
@@ -60,17 +63,17 @@ namespace OpenWifi::ProvObjects {
void ManagementPolicy::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json(Obj, "entries", entries);
RESTAPI_utils::field_to_json(Obj, "inUse", inUse);
RESTAPI_utils::field_to_json(Obj, "entity", entity);
field_to_json(Obj, "entries", entries);
field_to_json(Obj, "inUse", inUse);
field_to_json(Obj, "entity", entity);
}
bool ManagementPolicy::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json(Obj, "entries", entries);
RESTAPI_utils::field_from_json(Obj, "inUse", inUse);
RESTAPI_utils::field_from_json(Obj, "entity", entity);
field_from_json(Obj, "entries", entries);
field_from_json(Obj, "inUse", inUse);
field_from_json(Obj, "entity", entity);
return true;
} catch(...) {
@@ -80,31 +83,31 @@ namespace OpenWifi::ProvObjects {
void Entity::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"parent",parent);
RESTAPI_utils::field_to_json( Obj,"venues",venues);
RESTAPI_utils::field_to_json( Obj,"children",children);
RESTAPI_utils::field_to_json( Obj,"contacts",contacts);
RESTAPI_utils::field_to_json( Obj,"locations",locations);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_to_json( Obj,"devices",devices);
RESTAPI_utils::field_to_json( Obj,"rrm",rrm);
RESTAPI_utils::field_to_json( Obj,"sourceIP",sourceIP);
field_to_json( Obj,"parent",parent);
field_to_json( Obj,"venues",venues);
field_to_json( Obj,"children",children);
field_to_json( Obj,"contacts",contacts);
field_to_json( Obj,"locations",locations);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"devices",devices);
field_to_json( Obj,"rrm",rrm);
field_to_json( Obj,"sourceIP",sourceIP);
}
bool Entity::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json( Obj,"parent",parent);
RESTAPI_utils::field_from_json( Obj,"venues",venues);
RESTAPI_utils::field_from_json( Obj,"children",children);
RESTAPI_utils::field_from_json( Obj,"contacts",contacts);
RESTAPI_utils::field_from_json( Obj,"locations",locations);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_from_json( Obj,"devices",devices);
RESTAPI_utils::field_from_json( Obj,"rrm",rrm);
RESTAPI_utils::field_from_json( Obj,"sourceIP",sourceIP);
field_from_json( Obj,"parent",parent);
field_from_json( Obj,"venues",venues);
field_from_json( Obj,"children",children);
field_from_json( Obj,"contacts",contacts);
field_from_json( Obj,"locations",locations);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"devices",devices);
field_from_json( Obj,"rrm",rrm);
field_from_json( Obj,"sourceIP",sourceIP);
return true;
} catch(...) {
@@ -113,14 +116,14 @@ namespace OpenWifi::ProvObjects {
}
void DiGraphEntry::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json( Obj,"parent",parent);
RESTAPI_utils::field_to_json( Obj,"child",child);
field_to_json( Obj,"parent",parent);
field_to_json( Obj,"child",child);
}
bool DiGraphEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"parent",parent);
RESTAPI_utils::field_from_json( Obj,"child",child);
field_from_json( Obj,"parent",parent);
field_from_json( Obj,"child",child);
return true;
} catch (...) {
@@ -130,37 +133,37 @@ namespace OpenWifi::ProvObjects {
void Venue::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"parent",parent);
RESTAPI_utils::field_to_json( Obj,"entity",entity);
RESTAPI_utils::field_to_json( Obj,"children",children);
RESTAPI_utils::field_to_json( Obj,"devices",devices);
RESTAPI_utils::field_to_json( Obj,"topology",topology);
RESTAPI_utils::field_to_json( Obj,"parent",parent);
RESTAPI_utils::field_to_json( Obj,"design",design);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_to_json( Obj,"contact",contact);
RESTAPI_utils::field_to_json( Obj,"location",location);
RESTAPI_utils::field_to_json( Obj,"rrm",rrm);
RESTAPI_utils::field_to_json( Obj,"sourceIP",sourceIP);
field_to_json( Obj,"parent",parent);
field_to_json( Obj,"entity",entity);
field_to_json( Obj,"children",children);
field_to_json( Obj,"devices",devices);
field_to_json( Obj,"topology",topology);
field_to_json( Obj,"parent",parent);
field_to_json( Obj,"design",design);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"contact",contact);
field_to_json( Obj,"location",location);
field_to_json( Obj,"rrm",rrm);
field_to_json( Obj,"sourceIP",sourceIP);
}
bool Venue::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json( Obj,"parent",parent);
RESTAPI_utils::field_from_json( Obj,"entity",entity);
RESTAPI_utils::field_from_json( Obj,"children",children);
RESTAPI_utils::field_from_json( Obj,"devices",devices);
RESTAPI_utils::field_from_json( Obj,"topology",topology);
RESTAPI_utils::field_from_json( Obj,"parent",parent);
RESTAPI_utils::field_from_json( Obj,"design",design);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_from_json( Obj,"contact",contact);
RESTAPI_utils::field_from_json( Obj,"location",location);
RESTAPI_utils::field_from_json( Obj,"rrm",rrm);
RESTAPI_utils::field_from_json( Obj,"sourceIP",sourceIP);
field_from_json( Obj,"parent",parent);
field_from_json( Obj,"entity",entity);
field_from_json( Obj,"children",children);
field_from_json( Obj,"devices",devices);
field_from_json( Obj,"topology",topology);
field_from_json( Obj,"parent",parent);
field_from_json( Obj,"design",design);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"contact",contact);
field_from_json( Obj,"location",location);
field_from_json( Obj,"rrm",rrm);
field_from_json( Obj,"sourceIP",sourceIP);
return true;
} catch (...) {
@@ -169,16 +172,16 @@ namespace OpenWifi::ProvObjects {
}
void UserInfoDigest::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json( Obj,"id",id);
RESTAPI_utils::field_to_json( Obj,"entity",loginId);
RESTAPI_utils::field_to_json( Obj,"children",userType);
field_to_json( Obj,"id",id);
field_to_json( Obj,"entity",loginId);
field_to_json( Obj,"children",userType);
}
bool UserInfoDigest::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"id",id);
RESTAPI_utils::field_from_json( Obj,"entity",loginId);
RESTAPI_utils::field_from_json( Obj,"children",userType);
field_from_json( Obj,"id",id);
field_from_json( Obj,"entity",loginId);
field_from_json( Obj,"children",userType);
return true;
} catch(...) {
}
@@ -187,17 +190,17 @@ namespace OpenWifi::ProvObjects {
void ManagementRole::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_to_json( Obj,"users",users);
RESTAPI_utils::field_to_json( Obj,"entity",entity);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"users",users);
field_to_json( Obj,"entity",entity);
}
bool ManagementRole::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_from_json( Obj,"users",users);
RESTAPI_utils::field_from_json( Obj,"entity",entity);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"users",users);
field_from_json( Obj,"entity",entity);
return true;
} catch(...) {
}
@@ -206,39 +209,39 @@ namespace OpenWifi::ProvObjects {
void Location::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"type",OpenWifi::ProvObjects::to_string(type));
RESTAPI_utils::field_to_json( Obj,"buildingName",buildingName);
RESTAPI_utils::field_to_json( Obj,"addressLines",addressLines);
RESTAPI_utils::field_to_json( Obj,"city",city);
RESTAPI_utils::field_to_json( Obj,"state",state);
RESTAPI_utils::field_to_json( Obj,"postal",postal);
RESTAPI_utils::field_to_json( Obj,"country",country);
RESTAPI_utils::field_to_json( Obj,"phones",phones);
RESTAPI_utils::field_to_json( Obj,"mobiles",mobiles);
RESTAPI_utils::field_to_json( Obj,"geoCode",geoCode);
RESTAPI_utils::field_to_json( Obj,"inUse",inUse);
RESTAPI_utils::field_to_json( Obj,"entity",entity);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"type",OpenWifi::ProvObjects::to_string(type));
field_to_json( Obj,"buildingName",buildingName);
field_to_json( Obj,"addressLines",addressLines);
field_to_json( Obj,"city",city);
field_to_json( Obj,"state",state);
field_to_json( Obj,"postal",postal);
field_to_json( Obj,"country",country);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"geoCode",geoCode);
field_to_json( Obj,"inUse",inUse);
field_to_json( Obj,"entity",entity);
field_to_json( Obj,"managementPolicy",managementPolicy);
}
bool Location::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
std::string tmp_type;
RESTAPI_utils::field_from_json( Obj,"type", tmp_type);
field_from_json( Obj,"type", tmp_type);
type = location_from_string(tmp_type);
RESTAPI_utils::field_from_json( Obj,"buildingName",buildingName);
RESTAPI_utils::field_from_json( Obj,"addressLines",addressLines);
RESTAPI_utils::field_from_json( Obj,"city",city);
RESTAPI_utils::field_from_json( Obj,"state",state);
RESTAPI_utils::field_from_json( Obj,"postal",postal);
RESTAPI_utils::field_from_json( Obj,"country",country);
RESTAPI_utils::field_from_json( Obj,"phones",phones);
RESTAPI_utils::field_from_json( Obj,"mobiles",mobiles);
RESTAPI_utils::field_from_json( Obj,"geoCode",geoCode);
RESTAPI_utils::field_from_json( Obj,"inUse",inUse);
RESTAPI_utils::field_from_json( Obj,"entity",entity);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"buildingName",buildingName);
field_from_json( Obj,"addressLines",addressLines);
field_from_json( Obj,"city",city);
field_from_json( Obj,"state",state);
field_from_json( Obj,"postal",postal);
field_from_json( Obj,"country",country);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"geoCode",geoCode);
field_from_json( Obj,"inUse",inUse);
field_from_json( Obj,"entity",entity);
field_from_json( Obj,"managementPolicy",managementPolicy);
return true;
} catch (...) {
@@ -248,43 +251,43 @@ namespace OpenWifi::ProvObjects {
void Contact::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"type", to_string(type));
RESTAPI_utils::field_to_json( Obj,"title",title);
RESTAPI_utils::field_to_json( Obj,"salutation",salutation);
RESTAPI_utils::field_to_json( Obj,"firstname",firstname);
RESTAPI_utils::field_to_json( Obj,"lastname",lastname);
RESTAPI_utils::field_to_json( Obj,"initials",initials);
RESTAPI_utils::field_to_json( Obj,"visual",visual);
RESTAPI_utils::field_to_json( Obj,"mobiles",mobiles);
RESTAPI_utils::field_to_json( Obj,"phones",phones);
RESTAPI_utils::field_to_json( Obj,"primaryEmail",primaryEmail);
RESTAPI_utils::field_to_json( Obj,"secondaryEmail",secondaryEmail);
RESTAPI_utils::field_to_json( Obj,"accessPIN",accessPIN);
RESTAPI_utils::field_to_json( Obj,"inUse",inUse);
RESTAPI_utils::field_to_json( Obj,"entity",entity);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"type", to_string(type));
field_to_json( Obj,"title",title);
field_to_json( Obj,"salutation",salutation);
field_to_json( Obj,"firstname",firstname);
field_to_json( Obj,"lastname",lastname);
field_to_json( Obj,"initials",initials);
field_to_json( Obj,"visual",visual);
field_to_json( Obj,"mobiles",mobiles);
field_to_json( Obj,"phones",phones);
field_to_json( Obj,"primaryEmail",primaryEmail);
field_to_json( Obj,"secondaryEmail",secondaryEmail);
field_to_json( Obj,"accessPIN",accessPIN);
field_to_json( Obj,"inUse",inUse);
field_to_json( Obj,"entity",entity);
field_to_json( Obj,"managementPolicy",managementPolicy);
}
bool Contact::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
std::string tmp_type;
RESTAPI_utils::field_from_json( Obj,"type", tmp_type);
field_from_json( Obj,"type", tmp_type);
type = contact_from_string(tmp_type);
RESTAPI_utils::field_from_json( Obj,"title",title);
RESTAPI_utils::field_from_json( Obj,"salutation",salutation);
RESTAPI_utils::field_from_json( Obj,"firstname",firstname);
RESTAPI_utils::field_from_json( Obj,"lastname",lastname);
RESTAPI_utils::field_from_json( Obj,"initials",initials);
RESTAPI_utils::field_from_json( Obj,"visual",visual);
RESTAPI_utils::field_from_json( Obj,"mobiles",mobiles);
RESTAPI_utils::field_from_json( Obj,"phones",phones);
RESTAPI_utils::field_from_json( Obj,"primaryEmail",primaryEmail);
RESTAPI_utils::field_from_json( Obj,"secondaryEmail",secondaryEmail);
RESTAPI_utils::field_from_json( Obj,"accessPIN",accessPIN);
RESTAPI_utils::field_from_json( Obj,"inUse",inUse);
RESTAPI_utils::field_from_json( Obj,"entity",entity);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"title",title);
field_from_json( Obj,"salutation",salutation);
field_from_json( Obj,"firstname",firstname);
field_from_json( Obj,"lastname",lastname);
field_from_json( Obj,"initials",initials);
field_from_json( Obj,"visual",visual);
field_from_json( Obj,"mobiles",mobiles);
field_from_json( Obj,"phones",phones);
field_from_json( Obj,"primaryEmail",primaryEmail);
field_from_json( Obj,"secondaryEmail",secondaryEmail);
field_from_json( Obj,"accessPIN",accessPIN);
field_from_json( Obj,"inUse",inUse);
field_from_json( Obj,"entity",entity);
field_from_json( Obj,"managementPolicy",managementPolicy);
return true;
} catch (...) {
@@ -294,35 +297,35 @@ namespace OpenWifi::ProvObjects {
void InventoryTag::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json(Obj, "serialNumber", serialNumber);
RESTAPI_utils::field_to_json(Obj, "venue", venue);
RESTAPI_utils::field_to_json(Obj, "entity", entity);
RESTAPI_utils::field_to_json(Obj, "subscriber", subscriber);
RESTAPI_utils::field_to_json(Obj, "deviceType", deviceType);
RESTAPI_utils::field_to_json(Obj, "qrCode", qrCode);
RESTAPI_utils::field_to_json(Obj, "geoCode", geoCode);
RESTAPI_utils::field_to_json(Obj, "location", location);
RESTAPI_utils::field_to_json(Obj, "contact", contact);
RESTAPI_utils::field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_to_json( Obj,"rrm",rrm);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json(Obj, "serialNumber", serialNumber);
field_to_json(Obj, "venue", venue);
field_to_json(Obj, "entity", entity);
field_to_json(Obj, "subscriber", subscriber);
field_to_json(Obj, "deviceType", deviceType);
field_to_json(Obj, "qrCode", qrCode);
field_to_json(Obj, "geoCode", geoCode);
field_to_json(Obj, "location", location);
field_to_json(Obj, "contact", contact);
field_to_json( Obj,"deviceConfiguration",deviceConfiguration);
field_to_json( Obj,"rrm",rrm);
field_to_json( Obj,"managementPolicy",managementPolicy);
}
bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json( Obj,"serialNumber",serialNumber);
RESTAPI_utils::field_from_json( Obj,"venue",venue);
RESTAPI_utils::field_from_json( Obj,"entity",entity);
RESTAPI_utils::field_from_json( Obj,"subscriber",subscriber);
RESTAPI_utils::field_from_json( Obj,"deviceType",deviceType);
RESTAPI_utils::field_from_json(Obj, "qrCode", qrCode);
RESTAPI_utils::field_from_json( Obj,"geoCode",geoCode);
RESTAPI_utils::field_from_json( Obj,"location",location);
RESTAPI_utils::field_from_json( Obj,"contact",contact);
RESTAPI_utils::field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
RESTAPI_utils::field_from_json( Obj,"rrm",rrm);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"serialNumber",serialNumber);
field_from_json( Obj,"venue",venue);
field_from_json( Obj,"entity",entity);
field_from_json( Obj,"subscriber",subscriber);
field_from_json( Obj,"deviceType",deviceType);
field_from_json(Obj, "qrCode", qrCode);
field_from_json( Obj,"geoCode",geoCode);
field_from_json( Obj,"location",location);
field_from_json( Obj,"contact",contact);
field_from_json( Obj,"deviceConfiguration",deviceConfiguration);
field_from_json( Obj,"rrm",rrm);
field_from_json( Obj,"managementPolicy",managementPolicy);
return true;
} catch(...) {
@@ -331,18 +334,18 @@ namespace OpenWifi::ProvObjects {
}
void DeviceConfigurationElement::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json( Obj,"name", name);
RESTAPI_utils::field_to_json( Obj,"description", description);
RESTAPI_utils::field_to_json( Obj,"weight", weight);
RESTAPI_utils::field_to_json( Obj,"configuration", configuration);
field_to_json( Obj,"name", name);
field_to_json( Obj,"description", description);
field_to_json( Obj,"weight", weight);
field_to_json( Obj,"configuration", configuration);
}
bool DeviceConfigurationElement::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"name",name);
RESTAPI_utils::field_from_json( Obj,"description",description);
RESTAPI_utils::field_from_json( Obj,"weight",weight);
RESTAPI_utils::field_from_json( Obj,"configuration",configuration);
field_from_json( Obj,"name",name);
field_from_json( Obj,"description",description);
field_from_json( Obj,"weight",weight);
field_from_json( Obj,"configuration",configuration);
return true;
} catch(...) {
@@ -352,27 +355,27 @@ namespace OpenWifi::ProvObjects {
void DeviceConfiguration::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
RESTAPI_utils::field_to_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_to_json( Obj,"deviceTypes",deviceTypes);
RESTAPI_utils::field_to_json( Obj,"configuration",configuration);
RESTAPI_utils::field_to_json( Obj,"inUse",inUse);
RESTAPI_utils::field_to_json( Obj,"variables",variables);
RESTAPI_utils::field_to_json( Obj,"rrm",rrm);
RESTAPI_utils::field_to_json( Obj,"firmwareUpgrade",firmwareUpgrade);
RESTAPI_utils::field_to_json( Obj,"firmwareRCOnly",firmwareRCOnly);
field_to_json( Obj,"managementPolicy",managementPolicy);
field_to_json( Obj,"deviceTypes",deviceTypes);
field_to_json( Obj,"configuration",configuration);
field_to_json( Obj,"inUse",inUse);
field_to_json( Obj,"variables",variables);
field_to_json( Obj,"rrm",rrm);
field_to_json( Obj,"firmwareUpgrade",firmwareUpgrade);
field_to_json( Obj,"firmwareRCOnly",firmwareRCOnly);
}
bool DeviceConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
RESTAPI_utils::field_from_json( Obj,"managementPolicy",managementPolicy);
RESTAPI_utils::field_from_json( Obj,"deviceTypes",deviceTypes);
RESTAPI_utils::field_from_json( Obj,"configuration",configuration);
RESTAPI_utils::field_from_json( Obj,"inUse",inUse);
RESTAPI_utils::field_from_json( Obj,"variables",variables);
RESTAPI_utils::field_from_json( Obj,"rrm",rrm);
RESTAPI_utils::field_from_json( Obj,"firmwareUpgrade",firmwareUpgrade);
RESTAPI_utils::field_from_json( Obj,"firmwareRCOnly",firmwareRCOnly);
field_from_json( Obj,"managementPolicy",managementPolicy);
field_from_json( Obj,"deviceTypes",deviceTypes);
field_from_json( Obj,"configuration",configuration);
field_from_json( Obj,"inUse",inUse);
field_from_json( Obj,"variables",variables);
field_from_json( Obj,"rrm",rrm);
field_from_json( Obj,"firmwareUpgrade",firmwareUpgrade);
field_from_json( Obj,"firmwareRCOnly",firmwareRCOnly);
return true;
} catch(...) {
@@ -381,8 +384,8 @@ namespace OpenWifi::ProvObjects {
}
void Report::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "snapshot", snapShot);
RESTAPI_utils::field_to_json(Obj, "devices", tenants);
field_to_json(Obj, "snapshot", snapShot);
field_to_json(Obj, "devices", tenants);
};
void Report::reset() {
@@ -390,16 +393,16 @@ namespace OpenWifi::ProvObjects {
}
void ExpandedUseEntry::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "uuid", uuid);
RESTAPI_utils::field_to_json(Obj, "name", name);
RESTAPI_utils::field_to_json(Obj, "description", description);
field_to_json(Obj, "uuid", uuid);
field_to_json(Obj, "name", name);
field_to_json(Obj, "description", description);
}
bool ExpandedUseEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"uuid",uuid);
RESTAPI_utils::field_from_json( Obj,"name",name);
RESTAPI_utils::field_from_json( Obj,"description",description);
field_from_json( Obj,"uuid",uuid);
field_from_json( Obj,"name",name);
field_from_json( Obj,"description",description);
return true;
} catch(...) {
@@ -408,14 +411,14 @@ namespace OpenWifi::ProvObjects {
}
void ExpandedUseEntryList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "type", type);
RESTAPI_utils::field_to_json(Obj, "entries", entries);
field_to_json(Obj, "type", type);
field_to_json(Obj, "entries", entries);
}
bool ExpandedUseEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"type",type);
RESTAPI_utils::field_from_json( Obj,"entries",entries);
field_from_json( Obj,"type",type);
field_from_json( Obj,"entries",entries);
return true;
} catch(...) {
@@ -424,12 +427,94 @@ namespace OpenWifi::ProvObjects {
}
void ExpandedUseEntryMapList::to_json(Poco::JSON::Object &Obj) const {
RESTAPI_utils::field_to_json(Obj, "entries", entries);
field_to_json(Obj, "entries", entries);
}
bool ExpandedUseEntryMapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
RESTAPI_utils::field_from_json( Obj,"entries",entries);
field_from_json( Obj,"entries",entries);
return true;
} catch(...) {
}
return false;
}
void UserList::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "list", list);
}
bool UserList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "list", list);
return true;
} catch(...) {
}
return false;
}
void ObjectACL::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj, "users", users);
field_to_json(Obj, "access", access);
}
bool ObjectACL::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj, "users", users);
field_from_json(Obj, "access", access);
return true;
} catch(...) {
}
return false;
}
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) {
try {
field_from_json(Obj, "list", list);
return true;
} catch(...) {
}
return false;
}
void Map::to_json(Poco::JSON::Object &Obj) const {
info.to_json(Obj);
field_to_json( Obj,"data",data);
field_to_json( Obj,"entity",entity);
field_to_json( Obj,"creator",creator);
field_to_json( Obj,"visibility",visibility);
field_to_json( Obj,"access",access);
}
bool Map::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
info.from_json(Obj);
field_from_json( Obj,"data",data);
field_from_json( Obj,"entity",entity);
field_from_json( Obj,"creator",creator);
field_from_json( Obj,"visibility",visibility);
field_from_json( Obj,"access",access);
return true;
} catch(...) {
}
return false;
}
void MapList::to_json(Poco::JSON::Object &Obj) const {
field_to_json( Obj,"list",list);
}
bool MapList::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json( Obj,"list",list);
return true;
} catch(...) {
@@ -438,13 +523,47 @@ namespace OpenWifi::ProvObjects {
}
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
uint64_t Now = std::time(nullptr);
if(O->has("name"))
I.name = O->get("name").toString();
if(O->has("description"))
if(I.name.empty())
return false;
if(O->has("description"))
I.description = O->get("description").toString();
SecurityObjects::MergeNotes(O,U,I.notes);
I.modified = std::time(nullptr);
SecurityObjects::NoteInfoVec N;
for(auto &i:I.notes) {
if(i.note.empty())
continue;
N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note});
}
I.modified = Now;
return true;
}
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I) {
uint64_t Now = std::time(nullptr);
if(O->has("name"))
I.name = O->get("name").toString();
if(I.name.empty())
return false;
if(O->has("description"))
I.description = O->get("description").toString();
SecurityObjects::NoteInfoVec N;
for(auto &i:I.notes) {
if(i.note.empty())
continue;
N.push_back(SecurityObjects::NoteInfo{.created=Now,.createdBy=U.email,.note=i.note});
}
I.notes = N;
I.modified = I.created = Now;
I.id = MicroService::instance().CreateUUID();
return true;
}
};

View File

@@ -15,6 +15,13 @@
namespace OpenWifi::ProvObjects {
enum FIRMWARE_UPGRADE_RULES {
dont_upgrade,
upgrade_inherit,
upgrade_release_only,
upgrade_latest
};
struct ObjectInfo {
Types::UUID_t id;
std::string name;
@@ -317,7 +324,50 @@ namespace OpenWifi::ProvObjects {
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct UserList {
std::vector<std::string> list;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ObjectACL {
UserList users;
std::string access;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct ObjectACLList {
std::vector<ObjectACL> list;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct Map {
ObjectInfo info;
std::string data;
std::string entity;
std::string creator;
std::string visibility;
ObjectACLList access;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
struct MapList {
std::vector<Map> list;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
};
bool UpdateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I);
};

View File

@@ -138,7 +138,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"primary", primary);
}
bool MobilePhoneNumber::from_json(Poco::JSON::Object::Ptr Obj) {
bool MobilePhoneNumber::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"number",number);
field_from_json(Obj,"verified",verified);
@@ -155,7 +155,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"method", method);
}
bool MfaAuthInfo::from_json(Poco::JSON::Object::Ptr Obj) {
bool MfaAuthInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"enabled",enabled);
field_from_json(Obj,"method",method);
@@ -171,7 +171,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "mfa", mfa);
}
bool UserLoginLoginExtensions::from_json(Poco::JSON::Object::Ptr Obj) {
bool UserLoginLoginExtensions::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"mobiles",mobiles);
field_from_json(Obj,"mfa",mfa);
@@ -189,7 +189,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "method", method);
}
bool MFAChallengeRequest::from_json(Poco::JSON::Object::Ptr Obj) {
bool MFAChallengeRequest::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"uuid",uuid);
field_from_json(Obj,"question",question);
@@ -208,7 +208,7 @@ namespace OpenWifi::SecurityObjects {
}
bool MFAChallengeResponse::from_json(Poco::JSON::Object::Ptr Obj) {
bool MFAChallengeResponse::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"uuid",uuid);
field_from_json(Obj,"answer",answer);
@@ -387,11 +387,12 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"note", note);
}
bool NoteInfo::from_json(Poco::JSON::Object::Ptr Obj) {
bool NoteInfo::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"created",created);
field_from_json(Obj,"createdBy",createdBy);
field_from_json(Obj,"note",note);
return true;
} catch(...) {
}
@@ -428,10 +429,11 @@ namespace OpenWifi::SecurityObjects {
field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString);
}
bool ProfileAction::from_json(Poco::JSON::Object::Ptr Obj) {
bool ProfileAction::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"resource",resource);
field_from_json<ResourceAccessType>(Obj,"access",access,ResourceAccessTypeFromString );
return true;
} catch(...) {
}
@@ -447,7 +449,7 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj,"notes", notes);
}
bool SecurityProfile::from_json(Poco::JSON::Object::Ptr Obj) {
bool SecurityProfile::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"id",id);
field_from_json(Obj,"name",name);
@@ -455,6 +457,7 @@ namespace OpenWifi::SecurityObjects {
field_from_json(Obj,"policy",policy);
field_from_json(Obj,"role",role);
field_from_json(Obj,"notes",notes);
return true;
} catch(...) {
}
@@ -465,13 +468,51 @@ namespace OpenWifi::SecurityObjects {
field_to_json(Obj, "profiles", profiles);
}
bool SecurityProfileList::from_json(Poco::JSON::Object::Ptr Obj) {
bool SecurityProfileList::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"profiles",profiles);
return true;
} catch(...) {
}
return false;
}
void ActionLink::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"id",id);
field_to_json(Obj,"action",action);
field_to_json(Obj,"userId",userId);
field_to_json(Obj,"actionTemplate",actionTemplate);
field_to_json(Obj,"variables",variables);
field_to_json(Obj,"locale",locale);
field_to_json(Obj,"message",message);
field_to_json(Obj,"sent",sent);
field_to_json(Obj,"created",created);
field_to_json(Obj,"expires",expires);
field_to_json(Obj,"completed",completed);
field_to_json(Obj,"canceled",canceled);
}
bool ActionLink::from_json(Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"id",id);
field_from_json(Obj,"action",action);
field_from_json(Obj,"userId",userId);
field_from_json(Obj,"actionTemplate",actionTemplate);
field_from_json(Obj,"variables",variables);
field_from_json(Obj,"locale",locale);
field_from_json(Obj,"message",message);
field_from_json(Obj,"sent",sent);
field_from_json(Obj,"created",created);
field_from_json(Obj,"expires",expires);
field_from_json(Obj,"completed",completed);
field_from_json(Obj,"canceled",canceled);
return true;
} catch(...) {
}
return false;
}
}

View File

@@ -10,7 +10,7 @@
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
#include "Poco/JSON/Object.h"
#include "../framework/OpenWifiTypes.h"
#include "framework/OpenWifiTypes.h"
namespace OpenWifi::SecurityObjects {
@@ -53,25 +53,25 @@ namespace OpenWifi::SecurityObjects {
std::string createdBy;
std::string note;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
typedef std::vector<NoteInfo> NoteInfoVec;
struct MobilePhoneNumber {
std::string number;
bool verified;
bool primary;
bool verified = false;
bool primary = false;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct MfaAuthInfo {
bool enabled;
bool enabled = false;
std::string method;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct UserLoginLoginExtensions {
@@ -79,17 +79,17 @@ namespace OpenWifi::SecurityObjects {
struct MfaAuthInfo mfa;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct MFAChallengeRequest {
std::string uuid;
std::string question;
std::string method;
uint64_t created;
uint64_t created = std::time(nullptr);
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct MFAChallengeResponse {
@@ -97,7 +97,7 @@ namespace OpenWifi::SecurityObjects {
std::string answer;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct UserInfo {
@@ -200,7 +200,7 @@ namespace OpenWifi::SecurityObjects {
std::string resource;
ResourceAccessType access;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
typedef std::vector<ProfileAction> ProfileActionVec;
@@ -212,14 +212,37 @@ namespace OpenWifi::SecurityObjects {
std::string role;
NoteInfoVec notes;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
typedef std::vector<SecurityProfile> SecurityProfileVec;
struct SecurityProfileList {
SecurityProfileVec profiles;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr Obj);
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
enum LinkActions {
FORGOT_PASSWORD=1,
VERIFY_EMAIL
};
struct ActionLink {
std::string id;
uint64_t action;
std::string userId;
std::string actionTemplate;
Types::StringPairVec variables;
std::string locale;
std::string message;
uint64_t sent=0;
uint64_t created=std::time(nullptr);
uint64_t expires=0;
uint64_t completed=0;
uint64_t canceled=0;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
}

View File

@@ -9,8 +9,6 @@
namespace OpenWifi {
class SerialNumberCache * SerialNumberCache::instance_ = nullptr;
int SerialNumberCache::Start() {
StorageService()->UpdateSerialNumberCache();
return 0;

View File

@@ -11,10 +11,8 @@ namespace OpenWifi {
class SerialNumberCache : public SubSystemServer {
public:
static SerialNumberCache *instance() {
if (instance_ == nullptr) {
instance_ = new SerialNumberCache;
}
static SerialNumberCache * instance() {
static SerialNumberCache * instance_ = new SerialNumberCache;
return instance_;
}
@@ -23,9 +21,13 @@ namespace OpenWifi {
void AddSerialNumber(const std::string &S);
void DeleteSerialNumber(const std::string &S);
void FindNumbers(const std::string &S, uint HowMany, std::vector<uint64_t> &A);
inline bool NumberExists(const std::string &S) {
std::lock_guard G(M_);
uint64_t SN = std::stoull(S,0,16);
return std::find(SNs_.begin(),SNs_.end(),SN)!=SNs_.end();
}
private:
static SerialNumberCache * instance_;
uint64_t LastUpdate_ = 0 ;
std::vector<uint64_t> SNs_;
std::mutex M_;

View File

@@ -13,49 +13,43 @@ namespace OpenWifi {
try {
UpdatesSinceLastWrite_++;
// get the interfaces section
if(O->has("interfaces")) {
auto IFaces = O->get("interfaces");
if(IFaces.isArray()) {
auto IFaceObjs = IFaces.extract<Poco::JSON::Array::Ptr>();
for (auto const &i : *IFaceObjs) {
auto Interface = i.extract<Poco::JSON::Object::Ptr>();
if (Interface->has("name") && Interface->has("counters")) {
auto InterfaceName = Interface->get("name").toString();
auto InterfaceMapEntry = Stats_.find(InterfaceName);
if(InterfaceMapEntry == Stats_.end()) {
std::map<std::string,uint64_t> NewStatEntry;
Stats_[InterfaceName] = NewStatEntry;
InterfaceMapEntry = Stats_.find(InterfaceName);
}
auto CountersObj = Interface->get("counters").extract<Poco::JSON::Object::Ptr>();
Poco::DynamicStruct CounterVars = *CountersObj;
for (const auto &j : CounterVars) {
auto Entry = InterfaceMapEntry->second.find(j.first);
if(Entry==InterfaceMapEntry->second.end()) {
InterfaceMapEntry->second[j.first] = j.second;
} else {
InterfaceMapEntry->second[j.first] += j.second;
}
}
} else {
return false;
if(O->has("interfaces") && O->isArray("interfaces")) {
auto IFaces = O->getArray("interfaces");
for (auto const &i : *IFaces) {
auto Interface = i.extract<Poco::JSON::Object::Ptr>();
if (Interface->has("name") && Interface->has("counters")) {
auto InterfaceName = Interface->get("name").toString();
auto InterfaceMapEntry = Stats_.find(InterfaceName);
if(InterfaceMapEntry == Stats_.end()) {
std::map<std::string,uint64_t> NewStatEntry;
Stats_[InterfaceName] = NewStatEntry;
InterfaceMapEntry = Stats_.find(InterfaceName);
}
auto CountersObj = Interface->getObject("counters");
for (const auto &j : *CountersObj) {
auto Entry = InterfaceMapEntry->second.find(j.first);
if(Entry==InterfaceMapEntry->second.end()) {
InterfaceMapEntry->second[j.first] = j.second;
} else {
InterfaceMapEntry->second[j.first] += j.second;
}
}
} else {
return false;
}
if(Conn_)
GetAssociations(O,Conn_->Associations_2G,Conn_->Associations_5G);
if(UpdatesSinceLastWrite_>10)
Save();
return true;
}
if(Conn_)
GetAssociations(O,Conn_->Conn_.Associations_2G,Conn_->Conn_.Associations_5G);
if(UpdatesSinceLastWrite_>10)
Save();
return true;
} else {
std::cout << "No interfaces section" << std::endl;
Logger_.information(Poco::format("DEVICE(%s): State is missing interfaces",SerialNumber_));
}
} catch (const Poco::Exception &E ) {
std::cout << "Exception0.. " << E.displayText() << " " << E.what() << std::endl;
Logger_.log(E);
}
return false;
}
@@ -67,7 +61,7 @@ namespace OpenWifi {
const auto & Result = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
return Add(Result);
} catch (const Poco::Exception &E) {
std::cout << "Exception1.." << std::endl;
Logger_.log(E);
}
return false;
}
@@ -82,12 +76,6 @@ namespace OpenWifi {
}
void StateProcessor::to_json(Poco::JSON::Object & Obj) const {
/* interfaces: [
name:
counters: {
}
*/
Poco::JSON::Array Interfaces;
for(const auto & Interface: Stats_) {
Poco::JSON::Object InnerObj;
@@ -151,7 +139,16 @@ namespace OpenWifi {
Poco::JSON::Parser p2;
auto RadioObj = i.extract<Poco::JSON::Object::Ptr>();
if(RadioObj->has("phy") && RadioObj->has("channel")) {
RadioPHYs[RadioObj->get("phy").toString()]= ChannelToBand(RadioObj->get("channel"));
if(RadioObj->isArray("channel")) {
auto ChannelArray = RadioObj->getArray("channel");
if(ChannelArray->size()) {
RadioPHYs[RadioObj->get("phy").toString()] =
ChannelToBand( ChannelArray->getElement<uint64_t>(0) );
}
} else {
RadioPHYs[RadioObj->get("phy").toString()] =
ChannelToBand(RadioObj->get("channel"));
}
}
}

View File

@@ -4,16 +4,18 @@
#ifndef UCENTRALGW_STATEPROCESSOR_H
#define UCENTRALGW_STATEPROCESSOR_H
#include <map>
#include "Poco/JSON/Object.h"
#include "Poco/Logger.h"
#include "RESTObjects//RESTAPI_GWobjects.h"
#include <map>
#include "DeviceRegistry.h"
namespace OpenWifi {
class StateProcessor {
public:
explicit StateProcessor(GWObjects::ConnectionState * Conn):
Conn_(Conn) {}
explicit StateProcessor(std::shared_ptr<DeviceRegistry::ConnectionEntry> Conn, Poco::Logger & L):
Conn_(Conn), Logger_(L) {}
~StateProcessor() {
Save();
@@ -31,11 +33,12 @@ namespace OpenWifi {
private:
std::string SerialNumber_;
Poco::JSON::Object State_;
Poco::JSON::Object State_;
Poco::Logger & Logger_;
// interface name is the key, each entry is a map with the stats name as key and then the value
std::map<std::string,std::map<std::string,uint64_t>> Stats_;
uint64_t UpdatesSinceLastWrite_ = 0 ;
GWObjects::ConnectionState * Conn_ = nullptr;
std::shared_ptr<DeviceRegistry::ConnectionEntry> Conn_;
};
}

View File

@@ -10,92 +10,66 @@
namespace OpenWifi {
class StorageArchiver *StorageArchiver::instance_ = nullptr;
void StorageArchiver::run() {
Running_ = true ;
GetLastRun();
while(Running_) {
Poco::Thread::trySleep(2000);
Poco::DateTime Now;
if(!Running_)
break;
if(LastRun_!=Now.day()) {
if(Now.hour()>=RunAtHour_ && Now.minute()>=RunAtMin_) {
std::lock_guard G(Mutex_);
for(const auto &i:DBs_) {
if (!Poco::icompare(i.DBName, "healthchecks")) {
Logger_.information("Archiving HealthChecks...");
StorageService()->RemoveHealthChecksRecordsOlderThan(
std::time(nullptr) - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "statistics")) {
Logger_.information("Archiving Statistics...");
StorageService()->RemoveStatisticsRecordsOlderThan(
std::time(nullptr) - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "devicelogs")) {
Logger_.information("Archiving Device Logs...");
StorageService()->RemoveDeviceLogsRecordsOlderThan(
std::time(nullptr) - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "commandlist")) {
Logger_.information("Archiving Command History...");
StorageService()->RemoveCommandListRecordsOlderThan(
std::time(nullptr) - (i.HowManyDays * 24 * 60 * 60));
} else {
}
}
LastRun_ = Now.day();
SetLastRun();
}
void Archiver::onTimer(Poco::Timer &timer){
auto Now = std::time(nullptr);
for(const auto &i:DBs_) {
if (!Poco::icompare(i.DBName, "healthchecks")) {
Logger_.information("Archiving HealthChecks...");
StorageService()->RemoveHealthChecksRecordsOlderThan(
Now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "statistics")) {
Logger_.information("Archiving Statistics...");
StorageService()->RemoveStatisticsRecordsOlderThan(
Now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "devicelogs")) {
Logger_.information("Archiving Device Logs...");
StorageService()->RemoveDeviceLogsRecordsOlderThan(
Now - (i.HowManyDays * 24 * 60 * 60));
} else if (!Poco::icompare(i.DBName, "commandlist")) {
Logger_.information("Archiving Command History...");
StorageService()->RemoveCommandListRecordsOlderThan(
Now - (i.HowManyDays * 24 * 60 * 60));
} else {
Logger_.information(Poco::format("Cannot archive DB '%s'", i.DBName));
}
}
AppServiceRegistry().Set("lastStorageArchiverRun", (uint64_t) Now);
}
void StorageArchiver::GetLastRun() {
try {
Poco::File LR(LastRunFileName_);
try {
if (LR.exists()) {
std::ifstream I;
I.open(LR.path());
I >> LastRun_;
I.close();
} else {
LastRun_ = 0;
}
} catch(...) {
LastRun_=0;
}
} catch(...) {
LastRun_=0;
}
}
static auto CalculateDelta(int H, int M) {
Poco::LocalDateTime dt;
Poco::LocalDateTime scheduled(dt.year(), dt.month(), dt.day(), H, M, 0);
void StorageArchiver::SetLastRun() {
try {
std::ofstream O;
O.open(LastRunFileName_,std::ios::binary | std::ios::trunc);
O << LastRun_;
O.close();
} catch(const Poco::Exception &E) {
Logger_.log(E);
size_t delta = 0;
if ((dt.hour() < H) || (dt.hour()==H && dt.minute()<M)) {
delta = scheduled.timestamp().epochTime() - dt.timestamp().epochTime();
} else {
delta = (24*60*60) - (dt.timestamp().epochTime() - scheduled.timestamp().epochTime());
}
return delta;
}
int StorageArchiver::Start() {
Enabled_ = MicroService::instance().ConfigGetBool("archiver.enabled",false);
if(!Enabled_) {
Logger_.information("Archiver is disabled.");
return 0;
}
ArchiverCallback_ = std::make_unique<Poco::TimerCallback<Archiver>>(Archiver_,&Archiver::onTimer);
auto Schedule = MicroService::instance().ConfigGetString("archiver.schedule","03:00");
Types::StringVec S = Utils::Split(Schedule,':');
RunAtHour_ = std::atoi(S[0].c_str());
RunAtMin_ = std::atoi(S[1].c_str());
auto S = Poco::StringTokenizer(Schedule,":");
int RunAtHour_, RunAtMin_;
if(S.count()!=2) {
RunAtHour_ = 3 ;
RunAtMin_ = 0;
} else {
RunAtHour_ = std::atoi(S[0].c_str());
RunAtMin_ = std::atoi(S[1].c_str());
}
for(int i=0;i<20;i++) {
std::string key = "archiver.db." + std::to_string(i) + ".name";
@@ -105,7 +79,7 @@ namespace OpenWifi {
if(Poco::icompare(DBName,DB)==0) {
std::string Key = "archiver.db." + std::to_string(i) + ".keep";
auto Keep = MicroService::instance().ConfigGetInt(Key,7);
DBs_.push_back(ArchiverDBEntry{
Archiver_.AddDb(Archiver::ArchiverDBEntry{
.DBName = DB,
.HowManyDays = Keep
});
@@ -113,17 +87,21 @@ namespace OpenWifi {
}
}
}
LastRunFileName_ = MicroService::instance().DataDir() + "/archiver_lastrun.txt";
Janitor_.start(*this);
int NextRun = CalculateDelta(RunAtHour_,RunAtMin_);
Logger_.information(Poco::format("Next run in %d seconds.",NextRun));
Timer_.setStartInterval( NextRun * 1000);
Timer_.setPeriodicInterval(24 * 60 * 60 * 1000); // 1 hours
Timer_.start(*ArchiverCallback_);
return 0;
}
void StorageArchiver::Stop() {
if(Running_) {
Running_=false;
Janitor_.wakeUp();
Janitor_.join();
if(Enabled_) {
Timer_.stop();
}
}

View File

@@ -8,54 +8,58 @@
#include <functional>
#include "framework/MicroService.h"
#include "Poco/Timer.h"
namespace OpenWifi {
struct ArchiverDBEntry {
std::string DBName;
uint64_t HowManyDays=7;
};
typedef std::vector<ArchiverDBEntry> ArchiverDBEntryVec;
static const std::list<std::string> AllInternalDBNames{"healthchecks", "statistics", "devicelogs" , "commandlist" };
static const std::list<std::string> AllInternalDBNames{"healthchecks", "statistics", "devicelogs" , "commandlist" };
class Archiver {
public:
struct ArchiverDBEntry {
std::string DBName;
uint64_t HowManyDays=7;
};
typedef std::vector<ArchiverDBEntry> ArchiverDBEntryVec;
class StorageArchiver : public SubSystemServer, Poco::Runnable {
public:
static StorageArchiver *instance() {
if (instance_ == nullptr) {
instance_ = new StorageArchiver;
}
return instance_;
explicit Archiver(Poco::Logger &Logger):
Logger_(Logger) {
}
void run() override;
int Start() override;
void Stop() override;
void GetLastRun();
void SetLastRun();
inline bool Enabled() const { return Enabled_; }
private:
static StorageArchiver *instance_;
std::atomic_bool Running_ = false;
std::atomic_bool Enabled_ = false;
Poco::Thread Janitor_;
ArchiverDBEntryVec DBs_;
uint64_t RunAtHour_=0;
uint64_t RunAtMin_=0;
uint64_t LastRun_=0;
std::string LastRunFileName_;
StorageArchiver() noexcept:
SubSystemServer("StorageArchiver", "STORAGE-ARCHIVE", "archiver")
{
void onTimer(Poco::Timer & timer);
inline void AddDb(const ArchiverDBEntry &E ) {
DBs_.push_back(E);
}
private:
Poco::Logger &Logger_;
ArchiverDBEntryVec DBs_;
};
};
class StorageArchiver : public SubSystemServer {
inline StorageArchiver * StorageArchiver() { return StorageArchiver::instance(); }
public:
static StorageArchiver *instance() {
static StorageArchiver * instance_ = new StorageArchiver;
return instance_;
}
int Start() override;
void Stop() override;
inline bool Enabled() const { return Enabled_; }
private:
std::atomic_bool Enabled_ = false;
Poco::Timer Timer_;
Archiver Archiver_{Logger_};
std::unique_ptr<Poco::TimerCallback<Archiver>> ArchiverCallback_;
StorageArchiver() noexcept:
SubSystemServer("StorageArchiver", "STORAGE-ARCHIVE", "archiver")
{
}
};
inline StorageArchiver * StorageArchiver() { return StorageArchiver::instance(); }
} // namespace

View File

@@ -10,8 +10,6 @@
namespace OpenWifi {
class Storage *Storage::instance_ = nullptr;
int Storage::Start() {
std::lock_guard Guard(Mutex_);
StorageClass::Start();

View File

@@ -28,10 +28,8 @@ namespace OpenWifi {
};
static Storage *instance() {
if (instance_ == nullptr) {
instance_ = new Storage;
}
return instance_;
static Storage * instance_ = new Storage;
return instance_;
}
typedef std::map<std::string,std::string> DeviceCapabilitiesCache;
@@ -147,7 +145,6 @@ namespace OpenWifi {
inline bool GetDeviceCapabilitiesCache(DeviceCapabilitiesCache & Caps) { std::lock_guard G(Mutex_); Caps = CapsCache_; return true; };
private:
static Storage *instance_;
DeviceCapabilitiesCache CapsCache_;
};

View File

@@ -25,16 +25,20 @@
namespace OpenWifi {
class TelemetryStream *TelemetryStream::instance_ = nullptr;
int TelemetryStream::Start() {
ReactorPool_.Start();
Runner_.start(*this);
return 0;
}
void TelemetryStream::Stop() {
Logger_.notice("Stopping reactors...");
ReactorPool_.Stop();
Logger_.notice("Stopping reactors...");
ReactorPool_.Stop();
if(Running_) {
Running_ = false;
Runner_.join();
}
}
bool TelemetryStream::CreateEndpoint(const std::string &SerialNumber, std::string &EndPoint, std::string &UUID) {
@@ -42,7 +46,7 @@ namespace OpenWifi {
Poco::URI Public(MicroService::instance().ConfigGetString("openwifi.system.uri.public"));
Poco::URI U;
UUID = MicroService::instance().CreateUUID();
UUID = MicroService::CreateUUID();
U.setScheme("wss");
U.setHost(Public.getHost());
U.setPort(Public.getPort());
@@ -51,38 +55,70 @@ namespace OpenWifi {
U.addQueryParameter("uuid", UUID);
U.addQueryParameter("serialNumber", SerialNumber);
EndPoint = U.toString();
SerialNumbers_[SerialNumber] = UUID;
auto H = SerialNumbers_.find(SerialNumber);
if(H == SerialNumbers_.end()) {
std::set<std::string> UUIDs{UUID};
SerialNumbers_[SerialNumber] = UUIDs;
} else {
H->second.insert(UUID);
}
Clients_[UUID] = nullptr;
return true;
}
void TelemetryStream::DeleteEndPoint(const std::string &SerialNumber) {
std::lock_guard G(Mutex_);
auto H1 = SerialNumbers_.find(SerialNumber);
if(H1!=SerialNumbers_.end()) {
auto H2 = Clients_.find(H1->second);
if(H2!=Clients_.end()) {
try {
delete H2->second;
} catch (const Poco::Exception &E ) {
}
}
}
void TelemetryStream::UpdateEndPoint(const std::string &SerialNumber, const std::string &PayLoad) {
std::lock_guard G(QueueMutex_);
Queue_.push(QueueUpdate{.SerialNumber=SerialNumber,.Payload=PayLoad});
Runner_.wakeUp();
}
void TelemetryStream::UpdateEndPoint(const std::string &SerialNumber, const std::string &PayLoad) {
std::lock_guard G(Mutex_);
void TelemetryStream::run() {
Running_ = true;
std::vector<QueueUpdate> Entries;
auto H1 = SerialNumbers_.find(SerialNumber);
if(H1!=SerialNumbers_.end()) {
auto H2 = Clients_.find(H1->second);
if(H2!=Clients_.end() && H2->second!=nullptr) {
try {
H2->second->Send(PayLoad);
} catch (...) {
while(Running_) {
bool QueueEmpty = true;
{
std::lock_guard G(QueueMutex_);
QueueEmpty = Queue_.empty();
}
if(QueueEmpty) {
Poco::Thread::trySleep(2000);
continue;
}
if(!Running_)
break;
{
std::lock_guard G(QueueMutex_);
Entries.clear();
while(!Queue_.empty()) {
Entries.push_back(Queue_.front());
Queue_.pop();
}
}
{
std::lock_guard G(Mutex_);
for(auto &E:Entries) {
auto H1 = SerialNumbers_.find(E.SerialNumber);
if (H1 != SerialNumbers_.end()) {
for (auto &i : H1->second) {
auto H2 = Clients_.find(i);
if (H2 != Clients_.end() && H2->second != nullptr) {
try {
H2->second->Send(E.Payload);
} catch (...) {
}
}
if(!Running_)
break;
}
}
if(!Running_)
break;
}
}
}
@@ -90,13 +126,8 @@ namespace OpenWifi {
bool TelemetryStream::RegisterClient(const std::string &UUID, TelemetryClient *Client) {
std::lock_guard G(Mutex_);
auto Hint = Clients_.find(UUID);
if(Hint!=Clients_.end()) {
Hint->second = Client;
return true;
}
return false;
Clients_[UUID] = Client;
return true;
}
void TelemetryStream::DeRegisterClient(const std::string &UUID) {
@@ -106,9 +137,16 @@ namespace OpenWifi {
if(Hint!=Clients_.end()) {
Clients_.erase(Hint);
for(const auto &i:SerialNumbers_) {
if(i.second==UUID) {
SerialNumbers_.erase(i.first);
break;
auto S = i.second;
S.erase(UUID);
}
// remove empty slots
for( auto i = SerialNumbers_.begin(); i!= SerialNumbers_.end();) {
if(i->second.empty()) {
i = SerialNumbers_.erase(i);
} else {
++i;
}
}
}

View File

@@ -93,12 +93,15 @@ namespace OpenWifi {
void CompleteStartup();
};
class TelemetryStream : public SubSystemServer {
class TelemetryStream : public SubSystemServer, Poco::Runnable {
public:
struct QueueUpdate {
std::string SerialNumber;
std::string Payload;
};
static TelemetryStream *instance() {
if (instance_ == nullptr) {
instance_ = new TelemetryStream;
}
static TelemetryStream * instance_ = new TelemetryStream;
return instance_;
}
@@ -106,17 +109,19 @@ namespace OpenWifi {
void Stop() override;
bool CreateEndpoint(const std::string &SerialNumber, std::string &EndPoint, std::string &UUID);
void DeleteEndPoint(const std::string &SerialNumber);
void UpdateEndPoint(const std::string &SerialNumber, const std::string &PayLoad);
bool RegisterClient(const std::string &UUID, TelemetryClient *Client);
void DeRegisterClient(const std::string &UUID);
Poco::Net::SocketReactor & NextReactor() { return ReactorPool_.NextReactor(); }
void run() override;
private:
static TelemetryStream * instance_;
std::map<std::string, TelemetryClient *> Clients_; // uuid -> client
std::map<std::string, std::string> SerialNumbers_; // serialNumber -> uuid
TelemetryReactorPool ReactorPool_;
std::atomic_bool Running_=false;
std::map<std::string, TelemetryClient *> Clients_; // uuid -> client
std::map<std::string, std::set<std::string>> SerialNumbers_; // serialNumber -> uuid
TelemetryReactorPool ReactorPool_;
std::mutex QueueMutex_;
Poco::Thread Runner_;
std::queue<QueueUpdate> Queue_;
TelemetryStream() noexcept:
SubSystemServer("TelemetryServer", "TELEMETRY-SVR", "openwifi.telemetry")
{

View File

@@ -25,17 +25,10 @@
#include "framework/uCentral_Protocol.h"
#include "framework/MicroService.h"
#include "Daemon.h"
#include "SerialNumberCache.h"
namespace OpenWifi {
class WebSocketServer *WebSocketServer::instance_ = nullptr;
WebSocketServer::WebSocketServer() noexcept:
SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket")
{
}
bool WebSocketServer::ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate) {
if(IsCertOk()) {
Logger_.debug(Poco::format("CERTIFICATE(%s): issuer='%s' cn='%s'", ConnectionId, Certificate.issuerName(),Certificate.commonName()));
@@ -68,6 +61,9 @@ namespace OpenWifi {
Acceptors_.push_back(std::move(NewSocketAcceptor));
}
ReactorThread_.start(Reactor_);
SimulatorId_ = MicroService::instance().ConfigGetString("simulatorid","");
SimulatorEnabled_ = !SimulatorId_.empty();
return 0;
}
@@ -118,6 +114,12 @@ namespace OpenWifi {
Logger_.error(Poco::format("%s: No certificates available..", CId_));
}
if(WebSocketServer::IsSim(CN_) && !WebSocketServer()->IsSimEnabled()) {
Logger_.debug(Poco::format("CONNECTION(%s): Sim Device %s is not allowed. Disconnecting.", CId_, CN_));
delete this;
return;
}
SerialNumber_ = CN_;
if(!CN_.empty() && StorageService()->IsBlackListed(SerialNumber_)) {
Logger_.debug(Poco::format("CONNECTION(%s): Device %s is black listed. Disconnecting.", CId_, CN_));
@@ -155,6 +157,8 @@ namespace OpenWifi {
} catch (const Poco::Exception &E ) {
Logger_.error("Exception caught during device connection. Device will have to retry.");
Logger_.log(E);
} catch (...) {
Logger_.error("Exception caught during device connection. Device will have to retry. Unsecure connect denied.");
}
delete this;
}
@@ -168,8 +172,25 @@ namespace OpenWifi {
T.detach();
}
static void NotifyKafkaDisconnect(std::string SerialNumber) {
try {
Poco::JSON::Object Disconnect;
Poco::JSON::Object Details;
Details.set(uCentralProtocol::SERIALNUMBER, SerialNumber);
Details.set(uCentralProtocol::TIMESTAMP, std::time(nullptr));
Disconnect.set(uCentralProtocol::DISCONNECTION, Details);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(Disconnect, OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber, OS.str());
} catch (...) {
}
}
WSConnection::~WSConnection() {
DeviceRegistry()->UnRegister(SerialNumber_,this);
if(ConnectionId_)
DeviceRegistry()->UnRegister(SerialNumber_, ConnectionId_);
if(Registered_ && WS_)
{
Reactor_.removeEventHandler(*WS_,
@@ -189,15 +210,9 @@ namespace OpenWifi {
}
if(KafkaManager()->Enabled() && !SerialNumber_.empty()) {
Poco::JSON::Object Disconnect;
Poco::JSON::Object Details;
Details.set(uCentralProtocol::SERIALNUMBER, SerialNumber_);
Details.set(uCentralProtocol::TIMESTAMP,std::time(nullptr));
Disconnect.set(uCentralProtocol::DISCONNECTION,Details);
Poco::JSON::Stringifier Stringify;
std::ostringstream OS;
Stringify.condense(Disconnect,OS);
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, OS.str());
std::string s(SerialNumber_);
std::thread t([s](){ NotifyKafkaDisconnect(s);});
t.detach();
}
}
@@ -208,7 +223,7 @@ namespace OpenWifi {
return false;
uint64_t GoodConfig=ConfigurationCache().CurrentConfig(SerialNumber_);
if(GoodConfig && (GoodConfig==UUID || GoodConfig==Conn_->PendingUUID))
if(GoodConfig && (GoodConfig==UUID || GoodConfig==Conn_->Conn_.PendingUUID))
return false;
GWObjects::Device D;
@@ -221,10 +236,10 @@ namespace OpenWifi {
return false;
}
Conn_->PendingUUID = D.UUID;
Conn_->Conn_.PendingUUID = D.UUID;
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM;
Cmd.Status = uCentralProtocol::PENDING;
Cmd.Command = uCentralProtocol::CONFIGURE;
@@ -320,7 +335,7 @@ namespace OpenWifi {
}
if(Conn_!= nullptr)
Conn_->LastContact = std::time(nullptr);
Conn_->Conn_.LastContact = std::time(nullptr);
switch(EventType) {
case uCentralProtocol::ET_CONNECT: {
@@ -331,18 +346,18 @@ namespace OpenWifi {
auto Firmware = ParamsObj->get(uCentralProtocol::FIRMWARE).toString();
auto Capabilities = ParamsObj->get(uCentralProtocol::CAPABILITIES).toString();
Conn_ = DeviceRegistry()->Register(Serial, this);
Conn_ = DeviceRegistry()->Register(Serial, this, ConnectionId_);
SerialNumber_ = Serial;
Conn_->SerialNumber = Serial;
Conn_->UUID = UUID;
Conn_->Firmware = Firmware;
Conn_->PendingUUID = 0;
Conn_->LastContact = std::time(nullptr);
Conn_->Address = Utils::FormatIPv6(WS_->peerAddress().toString());
Conn_->Conn_.SerialNumber = Serial;
Conn_->Conn_.UUID = UUID;
Conn_->Conn_.Firmware = Firmware;
Conn_->Conn_.PendingUUID = 0;
Conn_->Conn_.LastContact = std::time(nullptr);
Conn_->Conn_.Address = Utils::FormatIPv6(WS_->peerAddress().toString());
CId_ = SerialNumber_ + "@" + CId_ ;
// We need to verify the certificate if we have one
if(!CN_.empty() && Utils::SerialNumberMatch(CN_,SerialNumber_)) {
if(!CN_.empty() && (Utils::SerialNumberMatch(CN_,SerialNumber_) || WebSocketServer()->IsSimSerialNumber(CN_))) {
CertValidation_ = GWObjects::VERIFIED;
Logger_.information(Poco::format("CONNECT(%s): Fully validated and authenticated device..", CId_));
} else {
@@ -351,21 +366,23 @@ namespace OpenWifi {
else
Logger_.information(Poco::format("CONNECT(%s): Authenticated but not validated. Serial='%s' CN='%s'", CId_, Serial, CN_));
}
Conn_->VerifiedCertificate = CertValidation_;
Conn_->Conn_.VerifiedCertificate = CertValidation_;
if (Daemon()->AutoProvisioning() && !StorageService()->DeviceExists(SerialNumber_)) {
auto DeviceExists = SerialNumberCache()->NumberExists(SerialNumber_);
if (Daemon()->AutoProvisioning() && !DeviceExists) {
StorageService()->CreateDefaultDevice(SerialNumber_, Capabilities, Firmware, Compatible_);
} else if (StorageService()->DeviceExists(SerialNumber_)) {
Conn_->Conn_.Compatible = Compatible_;
} else if (DeviceExists) {
StorageService()->UpdateDeviceCapabilities(SerialNumber_, Capabilities, Compatible_);
Conn_->Conn_.Compatible = Compatible_;
if(!Firmware.empty()) {
StorageService()->SetConnectInfo(SerialNumber_, Firmware );
}
LookForUpgrade(UUID);
}
Conn_->Compatible = Compatible_;
StatsProcessor_ = std::make_unique<StateProcessor>(Conn_);
StatsProcessor_ = std::make_unique<StateProcessor>(Conn_, Logger_);
StatsProcessor_->Initialize(Serial);
LookForUpgrade(UUID);
if(KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
@@ -402,7 +419,7 @@ namespace OpenWifi {
else
Logger_.debug(Poco::format("STATE(%s): UUID=%Lu Updating for CMD=%s.", CId_,
UUID, request_uuid));
Conn_->UUID = UUID;
Conn_->Conn_.UUID = UUID;
LookForUpgrade(UUID);
GWObjects::Statistics Stats{ .SerialNumber = SerialNumber_, .UUID = UUID, .Data = State};
Stats.Recorded = std::time(nullptr);
@@ -411,8 +428,7 @@ namespace OpenWifi {
StorageService()->SetCommandResult(request_uuid, State);
}
if (StatsProcessor_)
StatsProcessor_->Add(State);
StatsProcessor_->Add(State);
if(KafkaManager()->Enabled()) {
Poco::JSON::Stringifier Stringify;
@@ -451,7 +467,7 @@ namespace OpenWifi {
Logger_.debug(Poco::format("HEALTHCHECK(%s): UUID=%Lu Updating for CMD=%s.",
CId_, UUID, request_uuid));
Conn_->UUID = UUID;
Conn_->Conn_.UUID = UUID;
LookForUpgrade(UUID);
GWObjects::HealthCheck Check;
@@ -506,7 +522,7 @@ namespace OpenWifi {
.Severity = Severity,
.Recorded = (uint64_t)time(nullptr),
.LogType = 0,
.UUID = Conn_->UUID};
.UUID = Conn_->Conn_.UUID};
StorageService()->AddLog(DeviceLog);
} else {
Logger_.warning(Poco::format("LOG(%s): Missing parameters.", CId_));
@@ -602,7 +618,7 @@ namespace OpenWifi {
if(ParamsObj->get(uCentralProtocol::REBOOT).toString()=="true") {
GWObjects::CommandDetails Cmd;
Cmd.SerialNumber = SerialNumber_;
Cmd.UUID = MicroService::instance().CreateUUID();
Cmd.UUID = MicroService::CreateUUID();
Cmd.SubmittedBy = uCentralProtocol::SUBMITTED_BY_SYSTEM;
Cmd.Status = uCentralProtocol::PENDING;
Cmd.Command = uCentralProtocol::REBOOT;
@@ -709,7 +725,7 @@ namespace OpenWifi {
void WSConnection::ProcessIncomingFrame() {
bool MustDisconnect=false;
// bool MustDisconnect=false;
Poco::Buffer<char> IncomingFrame(0);
try {
@@ -720,18 +736,28 @@ namespace OpenWifi {
if (IncomingSize == 0 && flags == 0 && Op == 0) {
Logger_.information(Poco::format("DISCONNECT(%s): device has disconnected.", CId_));
MustDisconnect = true;
return delete this;
} else {
if (Conn_ != nullptr) {
Conn_->Conn_.RX += IncomingSize;
Conn_->Conn_.MessageCount++;
}
switch (Op) {
case Poco::Net::WebSocket::FRAME_OP_PING: {
Logger_.debug(Poco::format("WS-PING(%s): received. PONG sent back.", CId_));
WS_->sendFrame("", 0,
(int)Poco::Net::WebSocket::FRAME_OP_PONG |
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
if (Conn_ != nullptr) {
Conn_->Conn_.MessageCount++;
}
if (KafkaManager()->Enabled() && Conn_) {
Poco::JSON::Object PingObject;
Poco::JSON::Object PingDetails;
PingDetails.set(uCentralProtocol::FIRMWARE, Conn_->Firmware);
PingDetails.set(uCentralProtocol::FIRMWARE, Conn_->Conn_.Firmware);
PingDetails.set(uCentralProtocol::SERIALNUMBER, SerialNumber_);
PingDetails.set(uCentralProtocol::COMPATIBLE, Compatible_);
PingDetails.set(uCentralProtocol::CONNECTIONIP, CId_);
@@ -742,46 +768,49 @@ namespace OpenWifi {
KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_,
OS.str());
}
return;
}
break;
case Poco::Net::WebSocket::FRAME_OP_PONG: {
Logger_.debug(Poco::format("PONG(%s): received and ignored.",CId_));
Logger_.debug(Poco::format("PONG(%s): received and ignored.",CId_));
return;
}
break;
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.debug(Poco::format("FRAME(%s): Frame received (length=%d, flags=0x%x). Msg=%s",
CId_, IncomingSize, unsigned(flags),IncomingMessageStr));
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.debug(Poco::format("FRAME(%s): Frame received (length=%d, flags=0x%x). Msg=%s",
CId_, IncomingSize, unsigned(flags),IncomingMessageStr));
Poco::JSON::Parser parser;
auto ParsedMessage = parser.parse(IncomingMessageStr);
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
Poco::JSON::Parser parser;
auto ParsedMessage = parser.parse(IncomingMessageStr);
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
if (IncomingJSON->has(uCentralProtocol::JSONRPC)) {
if(IncomingJSON->has(uCentralProtocol::METHOD) &&
IncomingJSON->has(uCentralProtocol::PARAMS)) {
ProcessJSONRPCEvent(IncomingJSON);
} else if (IncomingJSON->has(uCentralProtocol::RESULT) &&
IncomingJSON->has(uCentralProtocol::ID)) {
Logger_.debug(Poco::format("RPC-RESULT(%s): payload: %s",CId_,IncomingMessageStr));
ProcessJSONRPCResult(IncomingJSON);
} else {
Logger_.warning(Poco::format(
"INVALID-PAYLOAD(%s): Payload is not JSON-RPC 2.0: %s", CId_,
IncomingMessageStr));
if (IncomingJSON->has(uCentralProtocol::JSONRPC)) {
if(IncomingJSON->has(uCentralProtocol::METHOD) &&
IncomingJSON->has(uCentralProtocol::PARAMS)) {
ProcessJSONRPCEvent(IncomingJSON);
} else if (IncomingJSON->has(uCentralProtocol::RESULT) &&
IncomingJSON->has(uCentralProtocol::ID)) {
Logger_.debug(Poco::format("RPC-RESULT(%s): payload: %s",CId_,IncomingMessageStr));
ProcessJSONRPCResult(IncomingJSON);
} else {
Logger_.warning(Poco::format(
"INVALID-PAYLOAD(%s): Payload is not JSON-RPC 2.0: %s", CId_,
IncomingMessageStr));
}
} else {
Logger_.error(Poco::format("FRAME(%s): illegal transaction header, missing 'jsonrpc'",CId_));
Errors_++;
}
} else {
Logger_.error(Poco::format("FRAME(%s): illegal transaction header, missing 'jsonrpc'",CId_));
Errors_++;
}
return;
}
break;
case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
Logger_.warning(Poco::format("CLOSE(%s): Device is closing its connection.",CId_));
MustDisconnect = true;
return delete this;
}
break;
@@ -790,11 +819,6 @@ namespace OpenWifi {
}
break;
}
if (Conn_ != nullptr) {
Conn_->RX += IncomingSize;
Conn_->MessageCount++;
}
}
}
catch (const Poco::Net::ConnectionResetException & E)
@@ -802,7 +826,7 @@ namespace OpenWifi {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning(Poco::format("%s(%s): Caught a ConnectionResetException: %s, Message: %s",
std::string(__func__), CId_, E.displayText(),IncomingMessageStr));
MustDisconnect= true;
return delete this;
}
catch (const Poco::JSON::JSONException & E)
{
@@ -815,57 +839,54 @@ namespace OpenWifi {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning(Poco::format("%s(%s): Caught a websocket exception: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException & E)
{
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning(Poco::format("%s(%s): Caught a SSLConnectionUnexpectedlyClosedException: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const Poco::Net::SSLException & E)
{
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning(Poco::format("%s(%s): Caught a SSL exception: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const Poco::Net::NetException & E) {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning( Poco::format("%s(%s): Caught a NetException: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const Poco::IOException & E) {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning( Poco::format("%s(%s): Caught a IOException: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const Poco::Exception &E) {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning( Poco::format("%s(%s): Caught a more generic Poco exception: %s. Message: %s",
std::string(__func__), CId_, E.displayText(), IncomingMessageStr ));
MustDisconnect = true ;
return delete this;
}
catch (const std::exception & E) {
std::string IncomingMessageStr = asString(IncomingFrame);
Logger_.warning( Poco::format("%s(%s): Caught a std::exception: %s. Message: %s",
std::string{__func__}, CId_, std::string{E.what()}, IncomingMessageStr) );
MustDisconnect = true ;
return delete this;
}
catch (...) {
MustDisconnect = true;
return delete this;
}
if(!MustDisconnect && Errors_<10)
return;
if(Errors_>10) {
Logger_.information(Poco::format("DISCONNECTING(%s): Too many errors",CId_));
}
if(Errors_<10)
return;
Logger_.information(Poco::format("DISCONNECTING(%s): Too many errors",CId_));
delete this;
}
@@ -874,7 +895,7 @@ namespace OpenWifi {
auto BytesSent = WS_->sendFrame(Payload.c_str(),(int)Payload.size());
if(Conn_)
Conn_->TX += BytesSent;
Conn_->Conn_.TX += BytesSent;
return BytesSent == Payload.size();
}

View File

@@ -102,7 +102,7 @@ namespace OpenWifi {
std::unique_ptr<Poco::Net::WebSocket> WS_;
std::string SerialNumber_;
std::string Compatible_;
GWObjects::ConnectionState * Conn_ = nullptr;
std::shared_ptr<DeviceRegistry::ConnectionEntry> Conn_;
bool Registered_ = false ;
std::string CId_;
std::string CN_;
@@ -110,6 +110,7 @@ namespace OpenWifi {
uint64_t Errors_=0;
std::unique_ptr<StateProcessor> StatsProcessor_;
bool Connected_=false;
uint64_t ConnectionId_=0;
void CompleteStartup();
};
@@ -117,9 +118,7 @@ namespace OpenWifi {
class WebSocketServer : public SubSystemServer {
public:
static WebSocketServer *instance() {
if (instance_ == nullptr) {
instance_ = new WebSocketServer;
}
static WebSocketServer *instance_ = new WebSocketServer;
return instance_;
}
@@ -130,14 +129,31 @@ namespace OpenWifi {
bool ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate);
Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); }
inline bool IsSimSerialNumber(const std::string & SerialNumber) const {
return IsSim(SerialNumber) && SerialNumber == SimulatorId_;
}
inline static bool IsSim(const std::string & SerialNumber) {
return SerialNumber.substr(0,6) == "53494d";
}
inline bool IsSimEnabled() const {
return SimulatorEnabled_;
}
private:
static WebSocketServer *instance_;
std::unique_ptr<Poco::Crypto::X509Certificate> IssuerCert_;
std::vector<std::unique_ptr<Poco::Net::ParallelSocketAcceptor<WSConnection, Poco::Net::SocketReactor>>> Acceptors_;
Poco::Net::SocketReactor Reactor_;
Poco::Thread ReactorThread_;
ReactorPool ReactorPool_;
WebSocketServer() noexcept;
std::string SimulatorId_;
bool SimulatorEnabled_=false;
WebSocketServer() noexcept:
SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket") {
}
};
inline WebSocketServer * WebSocketServer() { return WebSocketServer::instance(); }

View File

@@ -2,12 +2,14 @@
// Created by stephane bourque on 2021-09-14.
//
#include "Poco/Logger.h"
#include <fstream>
#include <iostream>
#include <fstream>
#include <regex>
#include "ConfigurationValidator.h"
#include "framework/MicroService.h"
#include "ConfigurationValidator.h"
#include "framework/CountryCodes.h"
#include "Poco/StringTokenizer.h"
namespace OpenWifi {
@@ -94,6 +96,69 @@ namespace OpenWifi {
}
}
},
"globals.wireless-multimedia.class-selector": {
"type": "array",
"items": {
"type": "string",
"enum": [
"CS1",
"CS2",
"CS3",
"CS4",
"CS5",
"CS6",
"AF11",
"AF12",
"AF13",
"AF21",
"AF22",
"AF23",
"AF31",
"AF32",
"AF33",
"AF41",
"AF42",
"AF43",
"DF",
"EF"
]
}
},
"globals.wireless-multimedia": {
"type": "object",
"properties": {
"UP0": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP1": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP2": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP3": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP4": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP5": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP6": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
},
"UP7": {
"$ref": "#/$defs/globals.wireless-multimedia.class-selector"
}
}
},
"globals.wireless-multimedia-profile": {
"type": "string",
"enum": [
"enterprise"
]
},
"globals": {
"type": "object",
"properties": {
@@ -110,6 +175,16 @@ namespace OpenWifi {
"examples": [
"fdca:1234:4567::/48"
]
},
"wireless-multimedia": {
"oneOf": [
{
"$ref": "#/$defs/globals.wireless-multimedia"
},
{
"$ref": "#/$defs/globals.wireless-multimedia-profile"
}
]
}
}
},
@@ -805,6 +880,7 @@ namespace OpenWifi {
"sae",
"sae-mixed",
"wpa3",
"wpa3-192",
"wpa3-mixed"
],
"examples": [
@@ -1141,8 +1217,11 @@ namespace OpenWifi {
"maxLength": 2
},
"domain-name": {
"type": "string",
"format": "hostname"
"type": "array",
"items": {
"type": "string",
"format": "hostname"
}
},
"nai-realm": {
"type": "array",
@@ -1263,6 +1342,25 @@ namespace OpenWifi {
}
]
}
},
"wan-metrics": {
"type": "object",
"properties": {
"info": {
"type": "string",
"enum": [
"up",
"down",
"testing"
]
},
"downlink": {
"type": "integer"
},
"uplink": {
"type": "integer"
}
}
}
}
},
@@ -1479,10 +1577,6 @@ namespace OpenWifi {
"type": "string",
"format": "ipv4",
"example": "192.168.100.1"
},
"vlan-id": {
"type": "integer",
"maximum": 4096
}
}
},
@@ -1840,9 +1934,13 @@ namespace OpenWifi {
"properties": {
"controller": {
"type": "string",
"uc-format": "cidr",
"format": "ip",
"example": "192.168.10.1"
},
"datapath-description": {
"type": "string",
"example": "Building 2, Floor 6, AP 2"
},
"mode": {
"type": "string",
"enum": [
@@ -1850,7 +1948,8 @@ namespace OpenWifi {
"ptcp",
"ssl",
"tcp"
]
],
"default": "ssl"
},
"ca-certificate": {
"type": "string"
@@ -1925,13 +2024,76 @@ namespace OpenWifi {
"service.quality-of-service": {
"type": "object",
"properties": {
"upload-rate": {
"select-ports": {
"type": "array",
"items": {
"type": "string",
"default": "WAN"
}
},
"bandwidth-up": {
"type": "integer",
"default": 0
},
"download-rate": {
"bandwidth-down": {
"type": "integer",
"default": 0
},
"classifier": {
"type": "array",
"items": {
"type": "object",
"properties": {
"dscp": {
"type": "string",
"enum": [
"CS0",
"CS1",
"CS2",
"CS3",
"CS4",
"CS5",
"CS6",
"CS7"
],
"default": "CS1"
},
"ports": {
"type": "array",
"items": {
"type": "object",
"properties": {
"protocol": {
"type": "string",
"enum": [
"any",
"tcp",
"udp"
],
"default": "any"
},
"port": {
"type": "integer"
},
"range-end": {
"type": "integer"
},
"reclassify": {
"type": "boolean",
"default": true
}
}
},
"dns": {
"type": "array",
"items": {
"type": "string",
"format": "fqdn"
}
}
}
}
}
}
}
},
@@ -2153,7 +2315,6 @@ namespace OpenWifi {
}
}
}
)"_json;
class ConfigurationValidator *ConfigurationValidator::instance_ = nullptr;
@@ -2162,13 +2323,13 @@ namespace OpenWifi {
if(Initialized_)
return;
std::string GitSchema;
if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) {
auto schema = json::parse(GitSchema);
Validator_->set_root_schema(schema);
Logger_.information("Using uCentral validation schema from GIT.");
} else {
std::string FileName{ MicroService::instance().DataDir() + "/ucentral.schema.json" };
try {
try {
if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) {
auto schema = json::parse(GitSchema);
Validator_->set_root_schema(schema);
Logger_.information("Using uCentral validation schema from GIT.");
} else {
std::string FileName{ MicroService::instance().DataDir() + "/ucentral.schema.json" };
std::ifstream input(FileName);
std::stringstream schema_file;
schema_file << input.rdbuf();
@@ -2176,10 +2337,10 @@ namespace OpenWifi {
auto schema = json::parse(schema_file.str());
Validator_->set_root_schema(schema);
Logger_.information("Using uCentral validation schema from local file.");
} catch (const Poco::Exception &E) {
Validator_->set_root_schema(DefaultUCentralSchema);
Logger_.information("Using uCentral validation from built-in default.");
}
} catch (const Poco::Exception &E) {
Validator_->set_root_schema(DefaultUCentralSchema);
Logger_.information("Using uCentral validation from built-in default.");
}
Initialized_ = Working_ = true;
}
@@ -2193,13 +2354,116 @@ namespace OpenWifi {
}
bool ConfigurationValidator::Validate(const std::string &C) {
static inline bool IsIPv4(const std::string &value) {
Poco::Net::IPAddress A;
return ((Poco::Net::IPAddress::tryParse(value,A) && A.family()==Poco::Net::IPAddress::IPv4));
}
static inline bool IsIPv6(const std::string &value) {
Poco::Net::IPAddress A;
return ((Poco::Net::IPAddress::tryParse(value,A) && A.family()==Poco::Net::IPAddress::IPv6));
}
static inline bool IsIP(const std::string &value) {
return IsIPv4(value) || IsIPv6(value);
}
static inline bool IsCIDRv6(const std::string &value) {
auto Tokens = Poco::StringTokenizer(value,"/");
if(Tokens.count()==2 && IsIPv6(Tokens[0])) {
auto Mask = std::atoi(Tokens[1].c_str());
if(Mask>=48 && Mask<=128)
return true;
}
return false;
}
static inline bool IsCIDRv4(const std::string &value) {
auto Tokens = Poco::StringTokenizer(value,"/");
if(Tokens.count()==2 && IsIPv4(Tokens[0])) {
auto Mask = std::atoi(Tokens[1].c_str());
if(Mask>=0 && Mask<=32)
return true;
}
return false;
}
static inline bool IsCIDR(const std::string &value) {
return IsCIDRv4(value) || IsCIDRv6(value);
}
void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value)
{
static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"};
static const std::regex mac_regex{"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"};
static const std::regex uc_timeout_regex{"^[0-9]+[dmshw]$"};
static const std::regex b64_regex("^[a-zA-Z0-9\\+/]*={0,3}$");
if(format == "uc-cidr4") {
if(IsCIDRv4(value))
return;
throw std::invalid_argument(value + " is not a valid CIDR IPv4: should be something like 192.168.0.0/16.");
} else if(format == "uc-cidr6") {
if(IsCIDRv6(value))
return;
throw std::invalid_argument(value + " is not a valid CIDR IPv6: should be something like 2e60:3500::/64.");
} else if(format=="uc-cidr") {
if(IsCIDR(value))
return;
throw std::invalid_argument(value + " is not a valid CIDR IPv6/IPv4: should be something like 2e60:3500::/64.");
} else if(format == "uc-mac") {
if(std::regex_match(value,mac_regex))
return;
throw std::invalid_argument(value + " is not a valid MAC: should be something like 2e60:3500::/64.");
} else if(format == "uc-timeout") {
if(std::regex_match(value,uc_timeout_regex))
return;
throw std::invalid_argument(value + " is not a proper timeout value: 6d, 300m, 24h, 84000s, infinite");
} else if(format == "uc-host") {
if(IsIP(value))
return;
if(std::regex_match(value,host_regex))
return;
throw std::invalid_argument(value + " is not a proper FQDN.");
} else if(format == "fqdn") {
if(std::regex_match(value,host_regex))
return;
throw std::invalid_argument(value + " is not a proper FQDN.");
} else if(format == "uc-base64") {
std::string s{value};
Poco::trimInPlace(s);
if( (s.size() %4 ==0) && std::regex_match(s,b64_regex))
return;
throw std::invalid_argument(value + " is not a base64 encoded value.");
} else if(format == "uri") {
try {
Poco::URI uri(value);
return;
} catch (...) {
}
throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com.");
} else if(format == "ip") {
if (IsIP(value))
return;
throw std::invalid_argument(value + " is not a valid IP address.");
} else {
try {
nlohmann::json_schema::default_string_format_check(format,value);
} catch (const std::logic_error &E) {
std::string Error{"JSON Schema validation: "};
}
}
}
bool ConfigurationValidator::Validate(const std::string &C, std::string &Error) {
if(Working_) {
try {
auto Doc = json::parse(C);
Validator_->validate(Doc);
return true;
} catch(const std::exception &E) {
Error = E.what();
std::cout << "Validation failed, here is why: " << E.what() << "\n";
return false;
}
}

View File

@@ -5,9 +5,8 @@
#ifndef OWPROV_CONFIGURATIONVALIDATOR_H
#define OWPROV_CONFIGURATIONVALIDATOR_H
#include "Poco/Logger.h"
#include "framework/MicroService.h"
#include <nlohmann/json-schema.hpp>
#include "framework/MicroService.h"
using nlohmann::json;
using nlohmann::json_schema::json_validator;
@@ -22,31 +21,8 @@ namespace OpenWifi {
return instance_;
}
bool Validate(const std::string &C);
static void my_format_checker(const std::string &format, const std::string &value)
{
/*
"format": "uc-mac"
"format": "uc-timeout",
"format": "uc-cidr4",
"format": "uc-cidr6",
"uc-format": "cidr",
"format": "fqdn",
"format": "uc-host",
"format": "uri"
"format": "hostname"
"format": "uc-base64"
if (format == "something") {
return;
if (!check_value_for_something(value))
throw std::invalid_argument("value is not a good something");
} else
throw std::logic_error("Don't know how to validate " + format);
*/
}
bool Validate(const std::string &C, std::string &Error);
static void my_format_checker(const std::string &format, const std::string &value);
int Start() override;
void Stop() override;
void reinitialize(Poco::Util::Application &self) override;
@@ -64,7 +40,7 @@ namespace OpenWifi {
};
inline ConfigurationValidator * ConfigurationValidator() { return ConfigurationValidator::instance(); }
inline bool ValidateUCentralConfiguration(const std::string &C) { return ConfigurationValidator::instance()->Validate(C); }
inline bool ValidateUCentralConfiguration(const std::string &C, std::string &Error) { return ConfigurationValidator::instance()->Validate(C, Error); }
}
#endif //OWPROV_CONFIGURATIONVALIDATOR_H

File diff suppressed because it is too large Load Diff

View File

@@ -47,13 +47,19 @@ namespace OpenWifi::RESTAPI::Errors {
static const std::string IdMustBe0{"To create a user, you must set the ID to 0"};
static const std::string InvalidUserRole{"Invalid userRole."};
static const std::string InvalidEmailAddress{"Invalid email address."};
static const std::string InvalidPassword{"Invalid password."};
static const std::string PasswordRejected{"Password was rejected. This maybe an old password."};
static const std::string InvalidIPRanges{"Invalid IP range specifications."};
static const std::string InvalidLOrderBy{"Invalid orderBy specification."};
static const std::string NeedMobileNumber{"You must provide at least one validated phone number."};
static const std::string BadMFAMethod{"MFA only supports sms or email."};
static const std::string InvalidCredentials{"Invalid credentials (username/password)."};
static const std::string InvalidPassword{"Password does not conform to basic password rules."};
static const std::string UserPendingVerification{"User access denied pending email verification."};
static const std::string PasswordMustBeChanged{"Password must be changed."};
static const std::string UnrecognizedRequest{"Ill-formed request. Please consult documentation."};
static const std::string MissingAuthenticationInformation{"Missing authentication information."};
static const std::string InsufficientAccessRights{"Insufficient access rights to complete the operation."};
static const std::string ExpiredToken{"Token has expired, user must login."};
}
#endif //OWPROV_RESTAPI_ERRORS_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-10-06.
//
#ifndef OPENWIFI_STORAGE_H
#define OPENWIFI_STORAGE_H
#pragma once
#include "Poco/Data/Session.h"
#include "Poco/Data/SessionPool.h"
@@ -26,13 +25,6 @@ namespace OpenWifi {
class StorageClass : public SubSystemServer {
public:
/* static StorageClass *instance() {
if (instance_ == nullptr) {
instance_ = new StorageClass;
}
return instance_;
}
*/
StorageClass() noexcept:
SubSystemServer("StorageClass", "STORAGE-SVR", "storage")
{
@@ -56,18 +48,18 @@ namespace OpenWifi {
}
void Stop() override {
Pool_->shutdown();
}
[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) {
if(dbType_==sqlite) {
return " LIMIT " + std::to_string(From-1) + ", " + std::to_string(HowMany) + " ";
return " LIMIT " + std::to_string(From) + ", " + std::to_string(HowMany) + " ";
} else if(dbType_==pgsql) {
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
} else if(dbType_==mysql) {
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
}
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " ";
return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From) + " ";
}
inline std::string ConvertParams(const std::string & S) const {
@@ -96,15 +88,13 @@ namespace OpenWifi {
inline int Setup_PostgreSQL();
protected:
std::unique_ptr<Poco::Data::SessionPool> Pool_;
std::unique_ptr<Poco::Data::SQLite::Connector> SQLiteConn_;
std::unique_ptr<Poco::Data::PostgreSQL::Connector> PostgresConn_;
std::unique_ptr<Poco::Data::MySQL::Connector> MySQLConn_;
DBType dbType_ = sqlite;
Poco::SharedPtr<Poco::Data::SessionPool> Pool_;
Poco::Data::SQLite::Connector SQLiteConn_;
Poco::Data::PostgreSQL::Connector PostgresConn_;
Poco::Data::MySQL::Connector MySQLConn_;
DBType dbType_ = sqlite;
};
// inline StorageClass * Storage() { return StorageClass::instance(); }
#ifdef SMALL_BUILD
int Service::Setup_MySQL() { Daemon()->exit(Poco::Util::Application::EXIT_CONFIG); return 0; }
int Service::Setup_PostgreSQL() { Daemon()->exit(Poco::Util::Application::EXIT_CONFIG); return 0; }
@@ -116,9 +106,8 @@ namespace OpenWifi {
auto DBName = MicroService::instance().DataDir() + "/" + MicroService::instance().ConfigGetString("storage.type.sqlite.db");
auto NumSessions = MicroService::instance().ConfigGetInt("storage.type.sqlite.maxsessions", 64);
auto IdleTime = MicroService::instance().ConfigGetInt("storage.type.sqlite.idletime", 60);
SQLiteConn_ = std::make_unique<Poco::Data::SQLite::Connector>();
SQLiteConn_->registerConnector();
Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_->name(), DBName, 4, NumSessions, IdleTime);
SQLiteConn_.registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 4, NumSessions, IdleTime));
return 0;
}
@@ -141,9 +130,8 @@ namespace OpenWifi {
";port=" + Port +
";compress=true;auto-reconnect=true";
MySQLConn_ = std::make_unique<Poco::Data::MySQL::Connector>();
MySQLConn_->registerConnector();
Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_->name(), ConnectionStr, 4, NumSessions, IdleTime);
MySQLConn_.registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(MySQLConn_.name(), ConnectionStr, 4, NumSessions, IdleTime));
return 0;
}
@@ -168,14 +156,11 @@ namespace OpenWifi {
" port=" + Port +
" connect_timeout=" + ConnectionTimeout;
PostgresConn_ = std::make_unique<Poco::Data::PostgreSQL::Connector>();
PostgresConn_->registerConnector();
Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_->name(), ConnectionStr, 4, NumSessions, IdleTime);
PostgresConn_.registerConnector();
Pool_ = Poco::SharedPtr<Poco::Data::SessionPool>(new Poco::Data::SessionPool(PostgresConn_.name(), ConnectionStr, 4, NumSessions, IdleTime));
return 0;
}
#endif
}
#endif //OPENWIFI_STORAGE_H

13
src/ow_version.h.in Normal file
View File

@@ -0,0 +1,13 @@
//
// Created by stephane bourque on 2021-12-06.
//
#pragma once
#include <string>
namespace OW_VERSION {
inline static const std::string VERSION{"@CMAKE_PROJECT_VERSION@"};
inline static const std::string BUILD{"@BUILD_NUM@"};
inline static const std::string HASH{"@GIT_HASH@"};
}

View File

@@ -157,9 +157,8 @@ typedef Poco::Tuple<
bool DatesIncluded = (FromDate != 0 || ToDate != 0);
std::string Fields{
"SELECT " +
DB_Command_SelectFields +
" FROM CommandList ORDER BY UUID ASC "};
"SELECT " + DB_Command_SelectFields + " FROM CommandList " };
std::string IntroStatement = SerialNumber.empty()
? Fields + std::string(DatesIncluded ? "WHERE " : "")
: Fields + "WHERE SerialNumber='" + SerialNumber + "'" +
@@ -177,7 +176,12 @@ typedef Poco::Tuple<
Poco::Data::Statement Select(Sess);
Select << IntroStatement + DateSelector + ComputeRange(Offset, HowMany),
std::string FullQuery = IntroStatement + DateSelector +
" ORDER BY Submitted ASC " + ComputeRange(Offset, HowMany);
// std::cout << "Offset: " << Offset << " >> " << FullQuery << std::endl;
Select << FullQuery,
Poco::Data::Keywords::into(Records);
Select.execute();
for (const auto &i : Records) {
@@ -355,12 +359,10 @@ typedef Poco::Tuple<
std::string st{"SELECT " +
DB_Command_SelectFields +
" FROM CommandList WHERE SerialNumber=? ORDER BY Submitted DESC"};
" FROM CommandList WHERE SerialNumber=? ORDER BY Submitted DESC " + ComputeRange(0, HowMany)};
Select << ConvertParams(st),
Poco::Data::Keywords::into(Records),
Poco::Data::Keywords::use(SerialNumber),
Poco::Data::Keywords::limit(HowMany);
Poco::Data::Keywords::use(SerialNumber);
Select.execute();
for (auto i : Records) {
@@ -677,7 +679,7 @@ typedef Poco::Tuple<
while(More) {
auto Command = RSet[0].convert<std::string>();
if(!Command.empty())
Types::UpdateCountedMap(R,Command);
OpenWifi::Types::UpdateCountedMap(R,Command);
More = RSet.moveNext();
}
return true;
@@ -687,4 +689,4 @@ typedef Poco::Tuple<
return false;
}
}
}

View File

@@ -414,14 +414,23 @@ namespace OpenWifi {
// std::lock_guard<std::mutex> guard(Mutex_);
try {
Poco::Data::Session Sess = Pool_->get();
Poco::Data::Statement Delete(Sess);
std::vector<std::string> DBList{"Devices", "Statistics", "CommandList", "HealthChecks", "LifetimeStats", "Capabilities", "DeviceLogs"};
std::string St{"DELETE FROM Devices WHERE SerialNumber=?"};
for(const auto &i:DBList) {
Poco::Data::Session Sess = Pool_->get();
Poco::Data::Statement Delete(Sess);
std::string St{"DELETE FROM " + i + " WHERE SerialNumber=?"};
try {
Delete << ConvertParams(St),
Poco::Data::Keywords::use(SerialNumber);
Delete.execute();
} catch (...) {
}
}
Delete << ConvertParams(St),
Poco::Data::Keywords::use(SerialNumber);
Delete.execute();
SerialNumberCache()->DeleteSerialNumber(SerialNumber);
return true;
}
@@ -724,6 +733,8 @@ namespace OpenWifi {
GWObjects::HealthCheck HC;
if(DeviceRegistry()->GetHealthcheck(SerialNumber,HC))
Types::UpdateCountedMap(Dashboard.healths, ComputeSanityTag(HC.Sanity));
else
Types::UpdateCountedMap(Dashboard.healths, ComputeSanityTag(100));
std::string LastStats;
if(DeviceRegistry()->GetStatistics(SerialNumber, LastStats) && !LastStats.empty()) {
Poco::JSON::Parser P;

View File

@@ -114,7 +114,7 @@ namespace OpenWifi {
std::string st{"SELECT " + DB_HealthCheckSelectFields + " FROM HealthChecks WHERE SerialNumber=? ORDER BY Recorded DESC "};
Select << ConvertParams(st) + ComputeRange(1,HowMany),
Select << ConvertParams(st) + ComputeRange(0,HowMany),
Poco::Data::Keywords::into(Records),
Poco::Data::Keywords::use(SerialNumber);
Select.execute();

View File

@@ -161,7 +161,7 @@ namespace OpenWifi {
Poco::Data::Statement Select(Sess);
std::string st{"SELECT " + DB_LogsSelectFields + " FROM DeviceLogs WHERE SerialNumber=? AND LogType=? ORDER BY Recorded DESC " + ComputeRange(1, HowMany)};
std::string st{"SELECT " + DB_LogsSelectFields + " FROM DeviceLogs WHERE SerialNumber=? AND LogType=? ORDER BY Recorded DESC " + ComputeRange(0, HowMany)};
Select << ConvertParams(st),
Poco::Data::Keywords::into(Records),
Poco::Data::Keywords::use(SerialNumber),

View File

@@ -112,7 +112,7 @@ namespace OpenWifi {
std::string St{"SELECT " +
DB_StatsSelectFields +
" FROM Statistics WHERE SerialNumber=? ORDER BY Recorded DESC "};
Select << ConvertParams(St) + ComputeRange(1, HowMany),
Select << ConvertParams(St) + ComputeRange(0, HowMany),
Poco::Data::Keywords::into(Records),
Poco::Data::Keywords::use(SerialNumber);
Select.execute();

View File

@@ -35,7 +35,7 @@ fi
token=""
result_file=result.json
username="tip@ucentral.com"
password="openwifi"
password="Snoopy99!!!"
browser_list=(firefox sensible-browser xdg-open w3m links links2 lynx youtube-dl)
browser=""
@@ -106,7 +106,7 @@ setgateway() {
fi
fi
done
echo "Using ${OWGW}..."
# echo "Using ${OWGW}..."
}
logout() {
@@ -137,7 +137,7 @@ deletecommand() {
}
listcommands() {
curl ${FLAGS} -X GET "https://${OWGW}/api/v1/commands?serialNumber=$1&limit=3000" \
curl ${FLAGS} -X GET "https://${OWGW}/api/v1/commands?serialNumber=$1&limit=300" \
-H "accept: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
jq < ${result_file}
@@ -157,7 +157,7 @@ deletecommands() {
}
getcapabilities() {
curl -${FLAGS} -X GET "https://${OWGW}/api/v1/device/$1/capabilities" \
curl ${FLAGS} -X GET "https://${OWGW}/api/v1/device/$1/capabilities" \
-H "accept: application/json" \
-H "Authorization: Bearer ${token}" > ${result_file}
jq < ${result_file}
@@ -189,6 +189,13 @@ deletedevice() {
-H "Authorization: Bearer ${token}"
}
deleteoui() {
curl ${FLAGS} -X DELETE "https://${OWGW}/api/v1/device/$1?oui=true" \
-H "accept: application/json" \
-H "Authorization: Bearer ${token}"
}
createdevice() {
payload="{ \"serialNumber\": \"$1\", \"UUID\": 1234456, \"configuration\" : $(cat "$2") , \"deviceType\": \"AP\",\"location\": \"\", \"macAddress\": \"$3\", \"manufacturer\": \"Linksys EA8300 (Dallas)\", \"owner\": \"\" }"
curl ${FLAGS} -X POST "https://${OWGW}/api/v1/device/$1" \
@@ -680,6 +687,7 @@ case "$1" in
"deletecapabilities") login; deletecapabilities "$2" ; logout ;;
"listdevices") login; listdevices ; logout ;;
"deletedevice") login; deletedevice "$2" ; logout ;;
"deleteoui") login; deleteoui "$2" ; logout ;;
"createdevice") login; createdevice "$2" "$3" "$4" ; logout ;;
"reboot") login; reboot "$2" ; logout ;;
"getdevicestatus") login; getdevicestatus "$2" ; logout ;;