From d18e6cc675d4e8703314de8eef086242ac3133cc Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Wed, 20 May 2020 14:54:21 +0300 Subject: [PATCH] Fix API initialization, closes #861 --- .../connectors/zabbix_api/zabbixAPIConnector.ts | 14 +++++++++++--- .../zabbix/connectors/zabbix_api/zabbixAPICore.ts | 2 +- src/datasource-zabbix/zabbix/proxy/cachingProxy.ts | 10 ++++++---- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts index 89dc84f..90908c9 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts @@ -62,12 +62,16 @@ export class ZabbixAPIConnector { return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth) .catch(error => { - if (isNotAuthorized(error.data)) { + if (isNotInitialized(error.data)) { + // If API not initialized yet (auth is empty), login first + return this.loginOnce() + .then(() => this.request(method, params)); + } else if (isNotAuthorized(error.data)) { // Handle auth errors this.loginErrorCount++; if (this.loginErrorCount > this.maxLoginAttempts) { this.loginErrorCount = 0; - return null; + return Promise.resolve(); } else { return this.loginOnce() .then(() => this.request(method, params)); @@ -237,7 +241,7 @@ export class ZabbixAPIConnector { }; return this.request('item.get', params) - .then(utils.expandItems); + .then(items => utils.expandItems(items)); } getMacros(hostids) { @@ -662,6 +666,10 @@ function filterTriggersByAcknowledge(triggers, acknowledged) { } } +function isNotInitialized(message) { + return message === "Not initialized"; +} + function isNotAuthorized(message) { return ( message === "Session terminated, re-login, please." || diff --git a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.ts b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.ts index 802f7fc..d23880b 100644 --- a/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.ts +++ b/src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.ts @@ -19,7 +19,7 @@ export class ZabbixAPICore { if (auth === "") { // Reject immediately if not authenticated - return Promise.reject(new ZabbixAPIError({data: "Not authorised."})); + return Promise.reject(new ZabbixAPIError({data: "Not initialized"})); } else if (auth) { // Set auth parameter only if it needed requestData.auth = auth; diff --git a/src/datasource-zabbix/zabbix/proxy/cachingProxy.ts b/src/datasource-zabbix/zabbix/proxy/cachingProxy.ts index d9c0e17..5d11628 100644 --- a/src/datasource-zabbix/zabbix/proxy/cachingProxy.ts +++ b/src/datasource-zabbix/zabbix/proxy/cachingProxy.ts @@ -86,10 +86,12 @@ function cacheRequest(func, funcName, funcScope, self) { } else { return func.apply(funcScope, arguments) .then(result => { - cacheObject[hash] = { - value: result, - timestamp: Date.now() - }; + if (result !== undefined) { + cacheObject[hash] = { + value: result, + timestamp: Date.now() + }; + } return result; }); }