From 76319c11d591df23377a2d853a7cdd84b7559d44 Mon Sep 17 00:00:00 2001 From: Benjamin Drieu Date: Mon, 22 Nov 2021 17:36:55 +0100 Subject: [PATCH] Some refactoring --- extension.js | 16 ++++---- servers/genericserver.js | 77 ++++++++++++++++++++++++++++++++++++--- servers/icinga.js | 79 ++++++++++++++-------------------------- servers/icinga2.js | 77 +++++++++++---------------------------- 4 files changed, 129 insertions(+), 120 deletions(-) diff --git a/extension.js b/extension.js index 9621c99..ef6cba4 100644 --- a/extension.js +++ b/extension.js @@ -85,9 +85,9 @@ class Indicator extends PanelMenu.Button { let type = this.account_settings.get_string ( "type" ); if ( type == 'Icinga' ) - this.serverlogic = new Icinga ( this.server ); + this.serverLogic = new Icinga ( this.server ); else if ( type == 'Icinga2' ) - this.serverlogic = new Icinga2 ( this.server ); + this.serverLogic = new Icinga2 ( this.server ); this.initUI ( ); } @@ -197,7 +197,7 @@ class Indicator extends PanelMenu.Button { updateStatus ( ) { - if ( ! this.serverlogic.refresh ( this ) ) + if ( ! this.serverLogic.refresh ( this ) ) { this.warningBoxes[this.server].set_text ( '…' ); this.criticalBoxes[this.server].set_text ( '…' ); @@ -298,9 +298,9 @@ class Indicator extends PanelMenu.Button { this._box.remove_all_children(); - if ( this.serverlogic.error ) + if ( this.serverLogic.error ) { - this._box.add_child ( new St.Label ( { style_class: 'monito-network-error', text: this.serverlogic.error } ) ); + this._box.add_child ( new St.Label ( { style_class: 'monito-network-error', text: this.serverLogic.error } ) ); return; } @@ -326,7 +326,7 @@ class Indicator extends PanelMenu.Button { }); scrollBox.add_actor(tableBox); - for ( let entry of this.serverlogic.getProcessedStatus ( ) ) + for ( let entry of this.serverLogic.getProcessedStatus ( ) ) { _status [ entry.status ] ++; if ( entry.status != 'OK' ) @@ -347,8 +347,8 @@ class Indicator extends PanelMenu.Button { } } - this.warningBoxes[this.serverlogic.server].set_text ( String(_status.WARNING) ); - this.criticalBoxes[this.serverlogic.server].set_text ( String(_status.CRITICAL) ); + this.warningBoxes[this.server].set_text ( String(_status.WARNING) ); + this.criticalBoxes[this.server].set_text ( String(_status.CRITICAL) ); return; } diff --git a/servers/genericserver.js b/servers/genericserver.js index e399943..24b2dd1 100644 --- a/servers/genericserver.js +++ b/servers/genericserver.js @@ -28,23 +28,88 @@ const Main = imports.ui.main; const Me = ExtensionUtils.getCurrentExtension(); const Preferences = Me.imports.prefs; -let _httpSession; - class GenericServer { constructor ( _server, _serverType = 'Generic' ) { log ( '>>> New %s server #%s'.format ( _serverType, _server ) ); - this.server = _server; + this._server = _server; + this._settings = Preferences.getAccountSettings ( this._server ); + this._httpSession = null; + this._url = null; } + getServer ( ) + { + return this._server; + } + + buildURL ( ) + { + if ( ! this._settings ) + this._settings = Preferences.getAccountSettings ( this._server ); + + this.type = this._settings.get_string ( "type" ); + this.username = this._settings.get_string ( "username" ); + this.name = this._settings.get_string ( "name" ); + this.password = this._settings.get_string ( "password" ); + this.urlcgi = this._settings.get_string ( "urlcgi" ); + + log ( 'monito server >>> ' + this._server ); + log ( 'monito name >>> ' + this.name ); + log ( 'monito type >>> ' + this.type ); + log ( 'monito username >>> ' + this.username ); + log ( 'monito urlcgi >>> ' + this.urlcgi ); + } + + + prepareHttp ( ) + { + if ( this._httpSession == null ) { + this._httpSession = new Soup.Session(); + this._httpSession.user_agent = Me.metadata.uuid; + } + } + + + authenticateAndSend ( message ) + { + let auth = new Soup.AuthBasic() + auth.authenticate ( this.username, this.password ); + message.request_headers.append ( "Authorization", auth.get_authorization ( message ) ); + + this._httpSession.queue_message ( message, Lang.bind (this, this.handleMessage ) ); + } + + + handleMessage ( _httpSession, message ) + { + this.status = { }; + this.status.service_status = [ ]; + + if ( message.status_code != Soup.Status.OK ) + { + log ( '>>> error: ' + message.reason_phrase ); + Main.notifyError ( 'Monito: ' + this.name, + 'URL: ' + this.urlcgi + "\n" + + message.status_code + ': ' + message.reason_phrase ); + this.error = message.reason_phrase; + return null; + } + else + { + return message.response_body.data; + } + } + + getProcessedStatus ( ) { let status = this.status.service_status; - this.columns = Preferences.getColumns(this.server); - this.sortOrder = Preferences.getSortOrder(this.server); + this.columns = Preferences.getColumns(this._server); + this.sortOrder = Preferences.getSortOrder(this._server); log ( this.sortOrder ); status = status.sort ( Lang.bind ( this, this.compareServices ) ); @@ -52,7 +117,7 @@ class GenericServer { return status; } - + compareServices ( a, b ) { for ( let _comparison of this.sortOrder ) diff --git a/servers/icinga.js b/servers/icinga.js index bb34d84..6c3723d 100644 --- a/servers/icinga.js +++ b/servers/icinga.js @@ -38,57 +38,34 @@ class Icinga extends GenericServer { } refresh ( extension ) { - let _settings = Preferences.getAccountSettings ( this.server ); - log ( 'monito server >>> ' + this.server ); - let type = _settings.get_string ( "type" ); - let username = _settings.get_string ( "username" ); - let name = _settings.get_string ( "name" ); - let password = _settings.get_string ( "password" ); - let urlcgi = _settings.get_string ( "urlcgi" ); + this.extension = extension; - log ( 'monito name >>> ' + name ); - log ( 'monito type >>> ' + type ); - log ( 'monito username >>> ' + username ); - log ( 'monito urlcgi >>> ' + urlcgi ); - - urlcgi = urlcgi.replace ( /^(https?:\/\/)/, '$1' + username + ':' + password + '@' ); - - if (_httpSession === undefined) { - _httpSession = new Soup.Session(); - _httpSession.user_agent = Me.metadata.uuid; - } - - try { - - let message = Soup.form_request_new_from_hash ( 'GET', urlcgi, { 'jsonoutput': '' } ); - - _httpSession.queue_message(message, Lang.bind - (this, function(_httpSession, message) - { - if ( message.status_code != Soup.Status.OK ) - { - log ( '>>> error: ' + message.reason_phrase ); - Main.notify ( 'Monito: ' + name, message.reason_phrase ); - this.status = null; - this.error = message.reason_phrase; - } - else - { - let json = JSON.parse(message.response_body.data); - this.status = json.status; - this.error = null; - } - - extension.refreshUI ( this ); - } - ) - ); - return this.status !== null; - } - catch (e) { - Main.notify(_('Zbeu!')); - log(e); - return false; - } + this.buildURL ( ); + this.prepareHttp ( ); } + + + prepareHttp ( ) + { + super.prepareHttp ( ); + + let message = Soup.form_request_new_from_hash ( 'GET', this.urlcgi, { 'jsonoutput': '' } ); + message.request_headers.append ( 'Accept', 'application/json' ); + + this.authenticateAndSend ( message ); + } + + + handleMessage ( _httpSession, message ) + { + let _data = super.handleMessage ( _httpSession, message ); + let json = JSON.parse ( _data ); + + this.status = json.status; + this.error = null; + this.extension.refreshUI ( this ); + + return this.status != { }; + } + } diff --git a/servers/icinga2.js b/servers/icinga2.js index 12f7d47..7a70057 100644 --- a/servers/icinga2.js +++ b/servers/icinga2.js @@ -29,8 +29,6 @@ const Me = ExtensionUtils.getCurrentExtension(); const Preferences = Me.imports.prefs; const GenericServer = Me.imports.servers.genericserver.GenericServer; -let _httpSession; - class Icinga2 extends GenericServer { constructor ( _server ) { @@ -39,72 +37,41 @@ class Icinga2 extends GenericServer { refresh ( extension ) { this.extension = extension; - this.settings = Preferences.getAccountSettings ( this.server ); - log ( 'monito server >>> ' + this.server ); - this.type = this.settings.get_string ( "type" ); - this.username = this.settings.get_string ( "username" ); - this.name = this.settings.get_string ( "name" ); - this.password = this.settings.get_string ( "password" ); - this.urlcgi = this.settings.get_string ( "urlcgi" ); - - log ( 'monito name >>> ' + this.name ); - log ( 'monito type >>> ' + this.type ); - log ( 'monito username >>> ' + this.username ); - log ( 'monito urlcgi >>> ' + this.urlcgi ); + this.buildURL ( ); this.prepareHttp ( ); } prepareHttp ( ) { - if (_httpSession === undefined) { - _httpSession = new Soup.Session(); - _httpSession.user_agent = Me.metadata.uuid; - } - + super.prepareHttp ( ); + let message = Soup.form_request_new_from_hash ( 'GET', this.urlcgi, { 'format': 'json' } ); message.request_headers.append ( 'Accept', 'application/json' ); - - let auth = new Soup.AuthBasic() - auth.authenticate ( this.username, this.password ); - message.request_headers.append ( "Authorization", auth.get_authorization ( message ) ); - - _httpSession.queue_message ( message, Lang.bind (this, this.handleMessage ) ); + + this.authenticateAndSend ( message ); } handleMessage ( _httpSession, message ) { - this.status = { }; - this.status.service_status = [ ]; - - if ( message.status_code != Soup.Status.OK ) - { - log ( '>>> error: ' + message.reason_phrase ); - Main.notifyError ( 'Monito: ' + this.name, - 'URL: ' + this.urlcgi + "\n" + - message.status_code + ': ' + message.reason_phrase ); - this.error = message.reason_phrase; - } - else - { - let json = JSON.parse(message.response_body.data); - let _statuses = [ 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN' ]; - - for ( var entry of json ) - { - this.status.service_status.push ( { - status: _statuses [ entry.service_state ], - host_name: entry.host_name, - service_display_name: entry.service_display_name, - attempts: entry.service_attempt, - status_information: entry.service_output, - last_check: new Date ( parseInt(entry.service_last_state_change) * 1000 ) . toString(), - } ); - } - this.error = null; - } + let _data = super.handleMessage ( _httpSession, message ); + let json = JSON.parse ( _data ); + let _statuses = [ 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN' ]; - this.extension.refreshUI ( this ); + for ( var entry of json ) + { + this.status.service_status.push ( { + status: _statuses [ entry.service_state ], + host_name: entry.host_name, + service_display_name: entry.service_display_name, + attempts: entry.service_attempt, + status_information: entry.service_output, + last_check: new Date ( parseInt(entry.service_last_state_change) * 1000 ) . toString(), + } ); + } + this.error = null; + + this.extension.refreshUI ( this ); return this.status != { }; } }