Skip to content
Draft

v3.9 #4690

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1b4cffd
feat(influxdb): add InfluxDB south connector supporting v1, v2 and v3
kbalinthunor Jun 2, 2026
c13a43c
feat(engine): configure default admin credentials and port at first run
kbalinthunor May 29, 2026
6473394
feat(engine): add engine name to init config and drop credential fiel…
kbalinthunor May 29, 2026
c84c9a5
fix(install): fix variables in Inno Setup scripts
burgerni10 Jun 8, 2026
70e7c65
fix(install): fix install script for default params and document them
burgerni10 Jun 8, 2026
af02b8a
feat(engine): split engine settings into dedicated endpoints
kbalinthunor Jun 2, 2026
f050254
feat(logger): add syslog transport
kbalinthunor Jun 2, 2026
a04b06d
fix(routes): remove deprecated tslint comment from generated routes file
kbalinthunor Jun 8, 2026
40ddd0d
feat(proxy): forward requests to upstream proxy
kbalinthunor Jun 3, 2026
904f3fe
fix(migration): revert migration-service destroy call
kbalinthunor Jun 8, 2026
5f179e6
fix(proxy): add forward proxy fields to EngineProxyCommandDTO and upd…
kbalinthunor Jun 15, 2026
6a68989
feat(proxy): add authentication for proxy server
kbalinthunor Jun 9, 2026
5cea660
feat(logger): make LoggerService a singleton with self-healing proxy …
kbalinthunor Jun 16, 2026
634ee8b
feat(south): add recovery strategy for historian reconnection gap fill
kbalinthunor Jun 22, 2026
3458878
feat(logger): add item_id/item_name to log model and db migration
kbalinthunor Jun 17, 2026
4233148
feat(logger): add group context to logs and translate internal scope ids
kbalinthunor Jun 29, 2026
fcb9eb9
fix(logger): fix ci lint and frontend spec failures
kbalinthunor Jun 29, 2026
221af07
fix(logger): fix suggestScopes for internal scopes with null scope_name
kbalinthunor Jun 29, 2026
2a97761
feat(south): replace overlap with startTimeOffset and endTimeOffset
kbalinthunor Jun 30, 2026
70cb29e
feat(south,north): add SMB auth for network shares
kbalinthunor Jun 23, 2026
5a820e7
fix(migration): merge 3.9.0 migration
burgerni10 Jul 2, 2026
8384d93
fix(south): use properly recovery strategy and tracked instant
burgerni10 Jul 2, 2026
b7e60da
fix(south): fix interval generation with recovery strategy and histor…
burgerni10 Jul 2, 2026
93e00c2
fix(migration): add settings in migration for folder scanner, and fil…
burgerni10 Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion backend/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,12 @@ export default [
{
// Test files and shared mocks use async functions extensively to satisfy
// Promise-returning interfaces, without ever needing an await expression.
// Generator mocks that throw before yielding are also legitimate in tests.
// Flagging these as errors would produce hundreds of false positives.
files: ['**/*.spec.ts', 'src/tests/**/*.ts'],
rules: {
'require-await': 'off'
'require-await': 'off',
'require-yield': 'off'
}
},
{
Expand Down
430 changes: 430 additions & 0 deletions backend/package-lock.json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
],
"dependencies": {
"@aws-sdk/client-s3": "3.1075.0",
"@influxdata/influxdb-client": "1.35.0",
"@influxdata/influxdb3-client": "2.2.0",
"@azure/storage-blob": "12.33.0",
"@azure/storage-file-datalake": "12.31.0",
"@smithy/node-http-handler": "4.8.2",
Expand All @@ -65,6 +67,7 @@
"helmet": "8.2.0",
"http-proxy": "1.18.1",
"https-proxy-agent": "7.0.6",
"influx": "5.12.0",
"isolated-vm": "7.0.0",
"joi": "18.2.3",
"jsmodbus": "4.0.10",
Expand All @@ -87,6 +90,8 @@
"pino-loki": "3.0.0",
"pino-pretty": "13.1.3",
"pino-roll": "4.0.0",
"pino-socket": "8.0.0",
"pino-syslog": "4.0.0",
"ssh2-sftp-client": "12.1.1",
"thread-stream": "4.2.0",
"tsoa": "6.6.0",
Expand Down Expand Up @@ -134,6 +139,7 @@
"dist/frontend/**/*",
"dist/backend/src/service/logger/sqlite-transport.js",
"dist/backend/src/service/logger/oianalytics-transport.js",
"dist/backend/src/service/logger/syslog-transport.js",
"dist/backend/src/migration/**/*.js",
"dist/backend/shared/**/*.js",
"node_modules/node-opcua-crypto/dist/source/index_web.js",
Expand Down
196 changes: 196 additions & 0 deletions backend/shared/model/engine.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,36 @@ export interface EngineSettingsDTO extends BaseEntity {
*/
proxyPort: number | null;

/**
* The URL of the upstream proxy to forward requests through.
* @example null
*/
forwardProxyUrl: string | null;

/**
* The username for upstream proxy authentication.
* @example null
*/
forwardProxyUsername: string | null;

/**
* The password for upstream proxy authentication.
* @example null
*/
forwardProxyPassword: string | null;

/**
* The username clients must use to authenticate with this proxy server. Null means no authentication required.
* @example null
*/
proxyUsername: string | null;

/**
* The password clients must use to authenticate with this proxy server.
* @example null
*/
proxyPassword: string | null;

/**
* Logging parameters for different outputs.
*/
Expand Down Expand Up @@ -156,6 +186,34 @@ export interface EngineSettingsDTO extends BaseEntity {
*/
interval: number;
};

/**
* Syslog logging configuration.
*/
syslog: {
/**
* The log level for syslog output.
*/
level: LogLevel;

/**
* The hostname or IP of the syslog server. Empty string disables the transport.
* @example "syslog.example.com"
*/
host: string;

/**
* The port of the syslog server.
* @example 514
*/
port: number;

/**
* The transport protocol.
* @example "udp4"
*/
protocol: 'udp4' | 'tcp';
};
};
}

Expand Down Expand Up @@ -861,6 +919,36 @@ export interface EngineSettingsCommandDTO {
*/
proxyPort: number | null;

/**
* The URL of the upstream proxy to forward requests through.
* @example null
*/
forwardProxyUrl: string | null;

/**
* The username for upstream proxy authentication.
* @example null
*/
forwardProxyUsername: string | null;

/**
* The password for upstream proxy authentication.
* @example null
*/
forwardProxyPassword: string | null;

/**
* The username clients must use to authenticate with this proxy server. Null means no authentication required.
* @example null
*/
proxyUsername: string | null;

/**
* The password clients must use to authenticate with this proxy server.
* @example null
*/
proxyPassword: string | null;

/**
* Logging parameters for different outputs.
*/
Expand Down Expand Up @@ -967,9 +1055,117 @@ export interface EngineSettingsCommandDTO {
*/
interval: number;
};

/**
* Syslog logging configuration.
*/
syslog: {
/**
* The log level for syslog output.
* @example "info"
*/
level: LogLevel;

/**
* The hostname or IP of the syslog server. Empty string disables the transport.
* @example "syslog.example.com"
*/
host: string;

/**
* The port of the syslog server.
* @example 514
*/
port: number;

/**
* The transport protocol.
* @example "udp4"
*/
protocol: 'udp4' | 'tcp';
};
};
}

/**
* Engine name command Data Transfer Object.
* Used as the request body for updating only the engine name.
*/
export interface EngineNameCommandDTO {
/**
* The name of the engine.
* @example "OIBus OT"
*/
name: string;
}

/**
* Engine web server command Data Transfer Object.
* Used as the request body for updating only the web server port.
*/
export interface EngineWebServerCommandDTO {
/**
* The port on which the engine listens.
* @example 8080
*/
port: number;
}

/**
* Engine proxy command Data Transfer Object.
* Used as the request body for updating only the proxy settings.
*/
export interface EngineProxyCommandDTO {
/**
* Whether the proxy is enabled.
* @example false
*/
proxyEnabled: boolean;

/**
* The port for the proxy, if enabled.
* @example null
*/
proxyPort: number | null;

/**
* The URL of the upstream proxy to forward requests through.
* @example null
*/
forwardProxyUrl: string | null;

/**
* The username for upstream proxy authentication.
* @example null
*/
forwardProxyUsername: string | null;

/**
* The password for upstream proxy authentication.
* @example null
*/
forwardProxyPassword: string | null;

/**
* The username for proxy server authentication.
* @example null
*/
proxyUsername: string | null;

/**
* The password for proxy server authentication.
* @example null
*/
proxyPassword: string | null;
}

/**
* Engine logger command Data Transfer Object.
* Used as the request body for updating only the logging parameters.
* The log category objects are top-level (no wrapper key).
*/
export type EngineLoggerCommandDTO = EngineSettingsCommandDTO['logParameters'];

/**
* Engine settings update result Data Transfer Object.
* Returned after updating engine settings to indicate if a redirect is needed.
Expand Down
26 changes: 26 additions & 0 deletions backend/shared/model/history-query.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
SouthFolderScannerSettings,
SouthFTPItemSettings,
SouthFTPSettings,
SouthInfluxDBItemSettings,
SouthInfluxDBSettings,
SouthModbusItemSettings,
SouthModbusSettings,
SouthMQTTItemSettings,
Expand Down Expand Up @@ -321,6 +323,14 @@ export interface HistoryQueryFolderScannerSouthDTO extends HistoryQuerySouthType
export interface HistoryQueryFTPSouthDTO extends HistoryQuerySouthTypedDTO<'ftp', SouthFTPSettings, SouthFTPItemSettings> {
items: Array<HistoryQueryFTPItemDTO>;
}
/** History query south DTO for InfluxDB time series database. */
export interface HistoryQueryInfluxDBSouthDTO extends HistoryQuerySouthTypedDTO<
'influxdb',
SouthInfluxDBSettings,
SouthInfluxDBItemSettings
> {
items: Array<HistoryQueryInfluxDBItemDTO>;
}
/** History query south DTO for Modbus. */
export interface HistoryQueryModbusSouthDTO extends HistoryQuerySouthTypedDTO<'modbus', SouthModbusSettings, SouthModbusItemSettings> {
items: Array<HistoryQueryModbusItemDTO>;
Expand Down Expand Up @@ -418,6 +428,7 @@ export type HistoryQueryDTO = BaseEntity &
| HistoryQueryADSSouthDTO
| HistoryQueryFolderScannerSouthDTO
| HistoryQueryFTPSouthDTO
| HistoryQueryInfluxDBSouthDTO
| HistoryQueryModbusSouthDTO
| HistoryQueryMQTTSouthDTO
| HistoryQueryMSSQLSouthDTO
Expand Down Expand Up @@ -516,6 +527,14 @@ export interface HistoryQueryFolderScannerSouthCommandDTO extends HistoryQuerySo
export interface HistoryQueryFTPSouthCommandDTO extends HistoryQuerySouthCommandTypedDTO<'ftp', SouthFTPSettings, SouthFTPItemSettings> {
items: Array<HistoryQueryFTPItemCommandDTO>;
}
/** History query south command for InfluxDB time series database. */
export interface HistoryQueryInfluxDBSouthCommandDTO extends HistoryQuerySouthCommandTypedDTO<
'influxdb',
SouthInfluxDBSettings,
SouthInfluxDBItemSettings
> {
items: Array<HistoryQueryInfluxDBItemCommandDTO>;
}
/** History query south command for Modbus. */
export interface HistoryQueryModbusSouthCommandDTO extends HistoryQuerySouthCommandTypedDTO<
'modbus',
Expand Down Expand Up @@ -664,6 +683,7 @@ export type HistoryQueryCommandDTO = HistoryQueryCommandCommonDTO &
| HistoryQueryADSSouthCommandDTO
| HistoryQueryFolderScannerSouthCommandDTO
| HistoryQueryFTPSouthCommandDTO
| HistoryQueryInfluxDBSouthCommandDTO
| HistoryQueryModbusSouthCommandDTO
| HistoryQueryMQTTSouthCommandDTO
| HistoryQueryMSSQLSouthCommandDTO
Expand Down Expand Up @@ -700,6 +720,8 @@ export interface HistoryQueryADSItemDTO extends HistoryQueryItemTypedDTO<SouthAD
export interface HistoryQueryFolderScannerItemDTO extends HistoryQueryItemTypedDTO<SouthFolderScannerItemSettings> {}
/** History query item DTO for FTP file transfer. */
export interface HistoryQueryFTPItemDTO extends HistoryQueryItemTypedDTO<SouthFTPItemSettings> {}
/** History query item DTO for InfluxDB time series database. */
export interface HistoryQueryInfluxDBItemDTO extends HistoryQueryItemTypedDTO<SouthInfluxDBItemSettings> {}
/** History query item DTO for Modbus. */
export interface HistoryQueryModbusItemDTO extends HistoryQueryItemTypedDTO<SouthModbusItemSettings> {}
/** History query item DTO for MQTT. */
Expand Down Expand Up @@ -739,6 +761,7 @@ export type HistoryQueryItemDTO =
| HistoryQueryADSItemDTO
| HistoryQueryFolderScannerItemDTO
| HistoryQueryFTPItemDTO
| HistoryQueryInfluxDBItemDTO
| HistoryQueryModbusItemDTO
| HistoryQueryMQTTItemDTO
| HistoryQueryMSSQLItemDTO
Expand All @@ -762,6 +785,8 @@ export interface HistoryQueryADSItemCommandDTO extends HistoryQueryItemCommandTy
export interface HistoryQueryFolderScannerItemCommandDTO extends HistoryQueryItemCommandTypedDTO<SouthFolderScannerItemSettings> {}
/** History query item command for FTP file transfer. */
export interface HistoryQueryFTPItemCommandDTO extends HistoryQueryItemCommandTypedDTO<SouthFTPItemSettings> {}
/** History query item command for InfluxDB time series database. */
export interface HistoryQueryInfluxDBItemCommandDTO extends HistoryQueryItemCommandTypedDTO<SouthInfluxDBItemSettings> {}
/** History query item command for Modbus. */
export interface HistoryQueryModbusItemCommandDTO extends HistoryQueryItemCommandTypedDTO<SouthModbusItemSettings> {}
/** History query item command for MQTT. */
Expand Down Expand Up @@ -801,6 +826,7 @@ export type HistoryQueryItemCommandDTO =
| HistoryQueryADSItemCommandDTO
| HistoryQueryFolderScannerItemCommandDTO
| HistoryQueryFTPItemCommandDTO
| HistoryQueryInfluxDBItemCommandDTO
| HistoryQueryModbusItemCommandDTO
| HistoryQueryMQTTItemCommandDTO
| HistoryQueryMSSQLItemCommandDTO
Expand Down
Loading
Loading