From d7408fdf0affeb88a9d7aaaacfc1dbb639537d5f Mon Sep 17 00:00:00 2001 From: Benjamin Drieu Date: Thu, 2 Dec 2021 17:52:08 +0100 Subject: [PATCH] Fix replacement bugs + implement correctly text-based filters --- extension.js | 7 ++- prefs.js | 2 + ...ll.extensions.monito@drieu.org.gschema.xml | 8 ++++ servers/genericserver.js | 47 ++++++++++++++++++- servers/icinga.js | 4 +- servers/icinga2api.js | 2 +- 6 files changed, 64 insertions(+), 6 deletions(-) diff --git a/extension.js b/extension.js index 386375d..69779c5 100644 --- a/extension.js +++ b/extension.js @@ -378,6 +378,7 @@ class Indicator extends PanelMenu.Button { let _columns = Preferences.getColumns ( this.server ); for ( let _col of _columns ) { + entry [ 'real_' + _col ] = entry [ _col ]; if ( _col == 'host_name' && this.account_settings.get_string ( 'host-match' ) ) entry [ _col ] = entry [ _col ] . replace ( new RegExp ( this.account_settings.get_string ( 'host-match' ), 'i' ), this.account_settings.get_string ( 'host-replace' ) ); @@ -387,7 +388,7 @@ class Indicator extends PanelMenu.Button { else if ( _col == 'status_information' && this.account_settings.get_string ( 'status-info-match' ) ) entry [ _col ] = entry [ _col ] . replace ( new RegExp ( this.account_settings.get_string ( 'status-info-match' ), 'i' ), this.account_settings.get_string ( 'status-info-replace' ) ); - + infoBox.add_child ( this.createBin ( entry.status, entry [ _col ], column_definitions [ _col ] ) ); } if ( this.serverLogic.canRecheck ) @@ -419,6 +420,10 @@ class Indicator extends PanelMenu.Button { this.boxes['unknown'].set_text ( String(_status.UNKNOWN) ); this.boxes['unknown'].get_parent().show ( ); } + else + { + this.boxes['unknown'].get_parent().hide ( ); + } } catch ( e ) { diff --git a/prefs.js b/prefs.js index 7d769b7..a873679 100644 --- a/prefs.js +++ b/prefs.js @@ -59,8 +59,10 @@ const prefs = [ { type: Gtk.ColorButton, category: 'Colors', label: _('Unknown color'), key: 'unknown-fg', align: Gtk.Align.START }, { type: Gtk.Entry, category: 'Filters', label: _('Only display hosts matching'), key: 'host-grep' }, { type: Gtk.Entry, category: 'Filters', label: _('Only display services matching'), key: 'service-grep' }, + { type: Gtk.Entry, category: 'Filters', label: _('Only display status info matching'), key: 'status-info-grep' }, { type: Gtk.Entry, category: 'Filters', label: _('Do not display hosts matching'), key: 'host-filter-out' }, { type: Gtk.Entry, category: 'Filters', label: _('Do not display services matching'), key: 'service-filter-out' }, + { type: Gtk.Entry, category: 'Filters', label: _('Do not display status info matching'), key: 'status-info-filter-out' }, { type: Gtk.Entry, category: 'Replacements', label: _('Host regexp ...'), key: 'host-match' }, { type: Gtk.Entry, category: 'Replacements', label: _('... to replace with'), key: 'host-replace' }, { type: Gtk.Entry, category: 'Replacements', label: _('Service regexp ...'), key: 'service-match' }, diff --git a/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml b/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml index 66b7e4d..361727e 100644 --- a/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml +++ b/schemas/org.gnome.shell.extensions.monito@drieu.org.gschema.xml @@ -125,6 +125,10 @@ '' + + '' + + '' @@ -133,6 +137,10 @@ '' + + '' + + '' diff --git a/servers/genericserver.js b/servers/genericserver.js index 273c862..416bae6 100644 --- a/servers/genericserver.js +++ b/servers/genericserver.js @@ -135,14 +135,57 @@ class GenericServer { { 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 ); + status = this.filterStatus ( status ); status = status.sort ( Lang.bind ( this, this.compareServices ) ); return status; } + + filterStatus ( status ) + { + let filters = [ { prefKey: 'service-grep', + entryKey: 'service_display_name', + positive: true }, + { prefKey: 'service-filter-out', + entryKey: 'service_display_name', + positive: false }, + { prefKey: 'host-grep', + entryKey: 'host_name', + positive: true }, + { prefKey: 'host-filter-out', + entryKey: 'host_name', + positive: false }, + { prefKey: 'status-info-grep', + entryKey: 'status_information', + positive: true }, + { prefKey: 'status-info-filter-out', + entryKey: 'status_information', + positive: false } ]; + + for ( var _filter of filters ) + _filter.value = this._settings.get_string ( _filter.prefKey ); + + entries: for ( var i = 0 ; i < status.length ; i ++ ) + { + for ( var _filter of filters ) + { + if ( _filter['value'] && + ( status[i][_filter['entryKey']].match ( new RegExp ( _filter['value'], 'i' ) ) <= 0 ) == _filter['positive'] ) + { +// log ( '> NOT MATCHING: %s =~ %s == %s ' . format ( status[i][_filter['entryKey']], _filter['value'], _filter['positive'] ) ); + status.splice ( i, 1 ); + i --; // This has been removed, so get back one step. + continue entries; + } + } + } + + return status; + } compareServices ( a, b ) { diff --git a/servers/icinga.js b/servers/icinga.js index d04909e..d64034a 100644 --- a/servers/icinga.js +++ b/servers/icinga.js @@ -67,8 +67,8 @@ class Icinga extends GenericServer { // We have to do this manually since the default encoding of // Soup.form_request_new_from_hash is not understood by Icinga ... a shame! let params = 'cmd_typ=7&cmd_mod=2&host=%s&service=%s&start_time=%s&force_check=on&com_data=Recheck+by+Monito&btnSubmit=Commit' . - format ( encodeURI ( entry.host_name ), - encodeURI ( entry.service_description ), + format ( encodeURI ( entry.real_host_name ), + encodeURI ( entry.real_service_display_name ), encodeURI ( datestring ) ); let message = Soup.form_request_new_from_hash ( 'POST', cmdcgi, { } ); diff --git a/servers/icinga2api.js b/servers/icinga2api.js index e0f886f..b7ea4c1 100644 --- a/servers/icinga2api.js +++ b/servers/icinga2api.js @@ -57,7 +57,7 @@ class Icinga2API extends GenericServer { { let message = Soup.form_request_new_from_hash ( 'POST', this.urlcgi + '/actions/reschedule-check', { } ); - let params = '{ "type": "Service", "filter": "host.name==\\"%s\\" && service.name==\\"%s\\"", "force": true, "pretty": true }' . format ( encodeURI ( entry.host_name ), encodeURI ( entry.service_display_name ) ); + let params = '{ "type": "Service", "filter": "host.name==\\"%s\\" && service.name==\\"%s\\"", "force": true, "pretty": true }' . format ( encodeURI ( entry.real_host_name ), encodeURI ( entry.real_service_display_name ) ); message.request_body.truncate(); message.request_body.append ( params );