Initial import
This commit is contained in:
commit
b770e12885
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
*~
|
||||||
|
#*
|
||||||
|
schemas/gschemas.compiled
|
8
Makefile
Normal file
8
Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
reload: schema
|
||||||
|
busctl --user call org.gnome.Shell /org/gnome/Shell org.gnome.Shell Eval s 'Meta.restart("Restarting…")'
|
||||||
|
|
||||||
|
schema:
|
||||||
|
glib-compile-schemas --strict schemas/
|
||||||
|
|
||||||
|
pref: reload
|
||||||
|
sleep 1 && gnome-extensions prefs monito@drieu.org
|
95
convenience.js
Normal file
95
convenience.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
/*
|
||||||
|
Copyright (c) 2011-2012, Giovanni Campagna <scampa.giovanni@gmail.com>
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the GNOME nor the
|
||||||
|
names of its contributors may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||||
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const Gettext = imports.gettext;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
|
||||||
|
const Config = imports.misc.config;
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initTranslations:
|
||||||
|
* @domain: (optional): the gettext domain to use
|
||||||
|
*
|
||||||
|
* Initialize Gettext to load translations from extensionsdir/locale.
|
||||||
|
* If @domain is not provided, it will be taken from metadata['gettext-domain']
|
||||||
|
*/
|
||||||
|
function initTranslations(domain) {
|
||||||
|
let extension = ExtensionUtils.getCurrentExtension();
|
||||||
|
|
||||||
|
domain = domain || extension.metadata['gettext-domain'];
|
||||||
|
|
||||||
|
// check if this extension was built with "make zip-file", and thus
|
||||||
|
// has the locale files in a subfolder
|
||||||
|
// otherwise assume that extension has been installed in the
|
||||||
|
// same prefix as gnome-shell
|
||||||
|
let localeDir = extension.dir.get_child('locale');
|
||||||
|
if (localeDir.query_exists(null))
|
||||||
|
Gettext.bindtextdomain(domain, localeDir.get_path());
|
||||||
|
else
|
||||||
|
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getSettings:
|
||||||
|
* @schema: (optional): the GSettings schema id
|
||||||
|
*
|
||||||
|
* Builds and return a GSettings schema for @schema, using schema files
|
||||||
|
* in extensionsdir/schemas. If @schema is not provided, it is taken from
|
||||||
|
* metadata['settings-schema'].
|
||||||
|
*/
|
||||||
|
function getSettings(schema,path=null) {
|
||||||
|
let extension = ExtensionUtils.getCurrentExtension();
|
||||||
|
|
||||||
|
schema = schema || extension.metadata['settings-schema'];
|
||||||
|
|
||||||
|
const GioSSS = Gio.SettingsSchemaSource;
|
||||||
|
|
||||||
|
// check if this extension was built with "make zip-file", and thus
|
||||||
|
// has the schema files in a subfolder
|
||||||
|
// otherwise assume that extension has been installed in the
|
||||||
|
// same prefix as gnome-shell (and therefore schemas are available
|
||||||
|
// in the standard folders)
|
||||||
|
let schemaDir = extension.dir.get_child('schemas');
|
||||||
|
let schemaSource;
|
||||||
|
if (schemaDir.query_exists(null))
|
||||||
|
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(),
|
||||||
|
GioSSS.get_default(),
|
||||||
|
false);
|
||||||
|
else
|
||||||
|
schemaSource = GioSSS.get_default();
|
||||||
|
|
||||||
|
let schemaObj = schemaSource.lookup(schema, true);
|
||||||
|
if (!schemaObj)
|
||||||
|
throw new Error('Schema ' + schema + ' could not be found for extension '
|
||||||
|
+ extension.metadata.uuid + '. Please check your installation.');
|
||||||
|
|
||||||
|
if ( path )
|
||||||
|
return new Gio.Settings({ settings_schema: schemaObj, path: path });
|
||||||
|
else
|
||||||
|
return new Gio.Settings({ settings_schema: schemaObj });
|
||||||
|
}
|
299
extension.js
Normal file
299
extension.js
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
/* extension.js
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* exported init */
|
||||||
|
|
||||||
|
const GETTEXT_DOMAIN = 'monito';
|
||||||
|
|
||||||
|
let _httpSession;
|
||||||
|
let _status;
|
||||||
|
let _ok_text;
|
||||||
|
let _warning_text;
|
||||||
|
let _critical_text;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain(GETTEXT_DOMAIN);
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
const Me = ExtensionUtils.getCurrentExtension();
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
|
const { GObject, St, Soup, Clutter } = imports.gi;
|
||||||
|
|
||||||
|
const SETTINGS_SCHEMA = "org.gnome.shell.extensions.monito@drieu.org";
|
||||||
|
const Convenience = Me.imports.convenience;
|
||||||
|
let settings = Convenience.getSettings(SETTINGS_SCHEMA);
|
||||||
|
|
||||||
|
|
||||||
|
const Indicator = GObject.registerClass(
|
||||||
|
class Indicator extends PanelMenu.Button {
|
||||||
|
_init() {
|
||||||
|
super._init(0.0, _('Monito Checker'));
|
||||||
|
|
||||||
|
let box = new St.BoxLayout ( { } );
|
||||||
|
this.add_child(box);
|
||||||
|
|
||||||
|
this.initStatus ( );
|
||||||
|
|
||||||
|
// Main Box
|
||||||
|
/*
|
||||||
|
let ok_box = new St.BoxLayout({ style_class: 'monito-ok-box monito-box' });
|
||||||
|
_ok_text = new St.Label({ text: String(_status['OK']) })
|
||||||
|
ok_box.add_child(_ok_text);
|
||||||
|
box.add_child(ok_box);
|
||||||
|
*/
|
||||||
|
let warning_box = new St.BoxLayout({ style_class: 'monito-warning-box monito-box' });
|
||||||
|
_warning_text = new St.Label({ text: String(_status['WARNING']) })
|
||||||
|
warning_box.add_child(_warning_text);
|
||||||
|
box.add_child(warning_box);
|
||||||
|
|
||||||
|
let critical_box = new St.BoxLayout({ style_class: 'monito-critical-box monito-box' });
|
||||||
|
_critical_text = new St.Label({ text: String(_status['CRITICAL']) })
|
||||||
|
critical_box.add_child(_critical_text);
|
||||||
|
box.add_child(critical_box);
|
||||||
|
|
||||||
|
box.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
|
||||||
|
|
||||||
|
// Menu
|
||||||
|
this._buttonMenu = new PopupMenu.PopupBaseMenuItem({
|
||||||
|
reactive: false,
|
||||||
|
style_class: 'monito-menu-button-container',
|
||||||
|
});
|
||||||
|
this.menu.addMenuItem(this._buttonMenu);
|
||||||
|
|
||||||
|
|
||||||
|
// let item = new PopupMenu.PopupMenuItem(_('Reload'));
|
||||||
|
// item.connect('activate', () => {
|
||||||
|
// this.updateStatus ( );
|
||||||
|
// });
|
||||||
|
// this.menu.addMenuItem(item);
|
||||||
|
|
||||||
|
this._mainLabel = new St.Label({ style_class: 'monito-title', text: 'Monito Checker', x_expand: true });
|
||||||
|
this._buttonMenu.actor.add_actor(this._mainLabel);
|
||||||
|
|
||||||
|
|
||||||
|
this._prefsButton = this._createButton ( 'preferences-system-symbolic', 'Preferences', this._onPreferencesActivate );
|
||||||
|
this._buttonMenu.actor.add_child (this._prefsButton);
|
||||||
|
|
||||||
|
this._reloadButton = this._createButton ( 'view-refresh-symbolic', 'Reload', this.updateStatus );
|
||||||
|
this._buttonMenu.actor.add_child (this._reloadButton );
|
||||||
|
|
||||||
|
|
||||||
|
let _intermediate = new PopupMenu.PopupBaseMenuItem ( {
|
||||||
|
style_class: 'monito-services',
|
||||||
|
reactive: false
|
||||||
|
});
|
||||||
|
|
||||||
|
this.menu.addMenuItem(_intermediate);
|
||||||
|
this._box = new St.BoxLayout({
|
||||||
|
style_class: 'monito-services',
|
||||||
|
vertical: true,
|
||||||
|
x_expand: true
|
||||||
|
});
|
||||||
|
_intermediate.actor.add_actor(this._box);
|
||||||
|
|
||||||
|
// let _bin = new St.Bin();
|
||||||
|
// _intermediate.actor.add_actor(_bin);
|
||||||
|
// _bin.set_child(this._services_table);
|
||||||
|
|
||||||
|
|
||||||
|
// this._list = new FlatList()
|
||||||
|
// _bin.set_child(this._list);
|
||||||
|
|
||||||
|
this.updateStatus ( );
|
||||||
|
}
|
||||||
|
|
||||||
|
initStatus ( ) {
|
||||||
|
_status = { 'OK': 0,
|
||||||
|
'WARNING': 0,
|
||||||
|
'CRITICAL': 0,
|
||||||
|
'UNKNOWN': 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
updateStatus ( ) {
|
||||||
|
const SETTINGS_SCHEMA_ACCOUNT = "org.gnome.shell.extensions.monito@drieu.org.account";
|
||||||
|
const Convenience = Me.imports.convenience;
|
||||||
|
let account_settings = Convenience.getSettings(SETTINGS_SCHEMA_ACCOUNT, '/org/gnome/shell/extensions/monito@drieu/org/account/0');
|
||||||
|
|
||||||
|
let username = account_settings.get_string("username");
|
||||||
|
let password = account_settings.get_string("password");
|
||||||
|
let urlcgi = account_settings.get_string("urlcgi");
|
||||||
|
|
||||||
|
if ( ! urlcgi )
|
||||||
|
{
|
||||||
|
log ( 'Not updating monito because no URL configured' );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
urlcgi = urlcgi.replace ( /^(https?:\/\/)/, '$1' + username + ':' + password + '@' );
|
||||||
|
// log ( 'monito >>> ' + urlcgi );
|
||||||
|
|
||||||
|
this.load_data_async ( urlcgi, { 'jsonoutput': '' }, function(res) { Main.notify(res); } )
|
||||||
|
}
|
||||||
|
|
||||||
|
createBin(status, text, col) {
|
||||||
|
let _widths = [ 300, 300, 200, 50, 600 ];
|
||||||
|
let _bin = new St.Bin({
|
||||||
|
style_class: 'monito-service-' + status,
|
||||||
|
width: _widths[col],
|
||||||
|
x_expand: ( col == 4 ? true : false ),
|
||||||
|
child: new St.Label({ style_class: 'monito-label', text: text })
|
||||||
|
});
|
||||||
|
return _bin;
|
||||||
|
}
|
||||||
|
|
||||||
|
load_data_async(url, params, fun) {
|
||||||
|
if (_httpSession === undefined) {
|
||||||
|
_httpSession = new Soup.Session();
|
||||||
|
_httpSession.user_agent = Me.metadata.uuid;
|
||||||
|
} else {
|
||||||
|
// abort previous requests.
|
||||||
|
_httpSession.abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
let message = Soup.form_request_new_from_hash('GET', url, params);
|
||||||
|
|
||||||
|
_httpSession.queue_message(message, Lang.bind(this, function(_httpSession, message) {
|
||||||
|
//Main.notify(message.response_body.data);
|
||||||
|
try {
|
||||||
|
// log ( message.response_body.data );
|
||||||
|
let json = JSON.parse(message.response_body.data);
|
||||||
|
|
||||||
|
this.initStatus ( );
|
||||||
|
|
||||||
|
this._box.remove_all_children();
|
||||||
|
|
||||||
|
for ( let i = 0 ; i < json.status.service_status.length ; i ++ )
|
||||||
|
{
|
||||||
|
_status [ json.status.service_status[i].status ] ++;
|
||||||
|
if ( json.status.service_status[i].status != 'OK' )
|
||||||
|
{
|
||||||
|
let infoBox = new St.BoxLayout({
|
||||||
|
style_class: 'monito-service-line monito-service-line-' + json.status.service_status[i].status,
|
||||||
|
hover: true,
|
||||||
|
x_expand: true
|
||||||
|
});
|
||||||
|
this._box.add_child(infoBox);
|
||||||
|
|
||||||
|
infoBox.add_child ( this.createBin ( json.status.service_status[i].status,
|
||||||
|
json.status.service_status[i].host_name,
|
||||||
|
0 ) );
|
||||||
|
infoBox.add_child ( this.createBin ( json.status.service_status[i].status,
|
||||||
|
json.status.service_status[i].service_display_name,
|
||||||
|
1 ) );
|
||||||
|
infoBox.add_child ( this.createBin ( json.status.service_status[i].status,
|
||||||
|
json.status.service_status[i].last_check,
|
||||||
|
2) );
|
||||||
|
infoBox.add_child ( this.createBin ( json.status.service_status[i].status,
|
||||||
|
json.status.service_status[i].attempts,
|
||||||
|
3 ) );
|
||||||
|
infoBox.add_child ( this.createBin ( json.status.service_status[i].status,
|
||||||
|
json.status.service_status[i].status_information,
|
||||||
|
4 ) );
|
||||||
|
|
||||||
|
// let url = 'https://xxx:xxx@host/cgi-bin/icinga/extinfo.cgi?type=2&host='+json.status.service_status[i].host_name+"&service="+json.status.service_status[i].service_description;
|
||||||
|
// activeLabel.connect('button-press-event', () => {
|
||||||
|
// Main.notify(url);
|
||||||
|
// Gtk.show_uri(null, url, global.get_current_time());
|
||||||
|
// } );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// _ok_text.set_text ( String(_status.OK) );
|
||||||
|
_warning_text.set_text ( String(_status.WARNING) );
|
||||||
|
_critical_text.set_text ( String(_status.CRITICAL) );
|
||||||
|
} catch (e) {
|
||||||
|
Main.notify(_('Zbeu!'));
|
||||||
|
_warning_text.set_text ( '…' );
|
||||||
|
_critical_text.set_text ( '…' );
|
||||||
|
log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onPreferencesActivate() {
|
||||||
|
this.menu.actor.hide();
|
||||||
|
if (typeof ExtensionUtils.openPrefs === 'function') {
|
||||||
|
ExtensionUtils.openPrefs();
|
||||||
|
} else {
|
||||||
|
Util.spawn([
|
||||||
|
"gnome-shell-extension-prefs",
|
||||||
|
Me.uuid
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_createButton ( icon, text, callback ) {
|
||||||
|
let button = new St.Button({
|
||||||
|
x_align: Clutter.ActorAlign.END,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
reactive: true,
|
||||||
|
can_focus: true,
|
||||||
|
track_hover: true,
|
||||||
|
accessible_name: text,
|
||||||
|
style_class: 'button'
|
||||||
|
});
|
||||||
|
|
||||||
|
button.child = new St.Icon({
|
||||||
|
style_class: 'monito-button-icon',
|
||||||
|
icon_name: icon,
|
||||||
|
icon_size: 24,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
});
|
||||||
|
|
||||||
|
button.connect('clicked', Lang.bind(this, callback ) );
|
||||||
|
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
class Extension {
|
||||||
|
constructor(uuid) {
|
||||||
|
this._uuid = uuid;
|
||||||
|
|
||||||
|
ExtensionUtils.initTranslations(GETTEXT_DOMAIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
enable() {
|
||||||
|
this._indicator = new Indicator();
|
||||||
|
Main.panel.addToStatusArea(this._uuid, this._indicator);
|
||||||
|
}
|
||||||
|
|
||||||
|
disable() {
|
||||||
|
this._indicator.destroy();
|
||||||
|
this._indicator = null;
|
||||||
|
|
||||||
|
if (_httpSession !== undefined)
|
||||||
|
_httpSession.abort();
|
||||||
|
|
||||||
|
_httpSession = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init(meta) {
|
||||||
|
return new Extension(meta.uuid);
|
||||||
|
}
|
8
metadata.json
Normal file
8
metadata.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "Monito",
|
||||||
|
"description": "Checks various monitoring websites",
|
||||||
|
"uuid": "monito@drieu.org",
|
||||||
|
"shell-version": [
|
||||||
|
"3.38"
|
||||||
|
]
|
||||||
|
}
|
198
prefs.js
Normal file
198
prefs.js
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
|
|
||||||
|
// It's common practice to keep GNOME API and JS imports in separate blocks
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
const Me = ExtensionUtils.getCurrentExtension();
|
||||||
|
const Convenience = Me.imports.convenience;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('monito');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const N_ = function (e) {
|
||||||
|
return e;
|
||||||
|
};
|
||||||
|
|
||||||
|
const SETTINGS_SCHEMA = "org.gnome.shell.extensions.monito@drieu.org";
|
||||||
|
const SETTINGS_SCHEMA_ACCOUNT = "org.gnome.shell.extensions.monito@drieu.org.account";
|
||||||
|
const SETTINGS_SCHEMA_ACCOUNT_PATH = "/org/gnome/shell/extensions/monito@drieu.org/account";
|
||||||
|
|
||||||
|
|
||||||
|
const prefs = [ { type: Gtk.Entry, label: _('Name'), key: 'name' },
|
||||||
|
{ type: Gtk.ComboBoxText, label: _('Type'), key: 'type' },
|
||||||
|
{ type: Gtk.Entry, label: _('Username'), key: 'username' },
|
||||||
|
{ type: Gtk.Entry, label: _('Password'), key: 'password' },
|
||||||
|
{ type: Gtk.Entry, label: _('URL CGI'), key: 'urlcgi' },
|
||||||
|
];
|
||||||
|
|
||||||
|
// Like 'extension.js' this is used for any one-time setup like translations.
|
||||||
|
function init() {
|
||||||
|
// log('initializing ${Me.metadata.name} Preferences');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This function is called when the preferences window is first created to build
|
||||||
|
// and return a Gtk widget. As an example we'll create and return a GtkLabel.
|
||||||
|
function buildPrefsWidget() {
|
||||||
|
|
||||||
|
// Copy the same GSettings code from `extension.js`
|
||||||
|
this.settings = ExtensionUtils.getSettings(SETTINGS_SCHEMA);
|
||||||
|
|
||||||
|
let mainVbox = new Gtk.Box( { orientation: Gtk.Orientation.VERTICAL } );
|
||||||
|
|
||||||
|
let mainWidget = new Gtk.Notebook( { } );
|
||||||
|
|
||||||
|
let prefsWidget = new Gtk.Grid({
|
||||||
|
margin: 18,
|
||||||
|
column_spacing: 12,
|
||||||
|
row_spacing: 12,
|
||||||
|
column_homogeneous: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.prefWidgets = { };
|
||||||
|
|
||||||
|
// Add a simple title and add it to the prefsWidget
|
||||||
|
let title = new Gtk.Label({
|
||||||
|
label: `<b>${Me.metadata.name} Preferences</b>`,
|
||||||
|
halign: Gtk.Align.START,
|
||||||
|
use_markup: true,
|
||||||
|
});
|
||||||
|
prefsWidget.attach(title, 0, 0, 2, 1);
|
||||||
|
|
||||||
|
// Misc Settings (TBD)
|
||||||
|
mainWidget.append_page ( prefsWidget,
|
||||||
|
new Gtk.Label ( { label: 'General', } ) );
|
||||||
|
|
||||||
|
|
||||||
|
// Accounts
|
||||||
|
let accountsWidgetContainer = new Gtk.Box( { orientation: Gtk.Orientation.HORIZONTAL,
|
||||||
|
homogeneous: false, } );
|
||||||
|
mainWidget.append_page ( accountsWidgetContainer,
|
||||||
|
new Gtk.Label ( { label: 'Servers', } ) );
|
||||||
|
|
||||||
|
let accountsChooserContainer = new Gtk.Box( { orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
homogeneous: false, } );
|
||||||
|
accountsWidgetContainer.pack_start(accountsChooserContainer, true, true, 0);
|
||||||
|
|
||||||
|
let accountsChooser = new Gtk.ListBox ( { valign: Gtk.Align.FILL,
|
||||||
|
hexpand: true,
|
||||||
|
vexpand: true } );
|
||||||
|
accountsChooserContainer.pack_start(accountsChooser, true, true, 0);
|
||||||
|
|
||||||
|
// Account list
|
||||||
|
for ( var server of this.settings.get_string ( 'servers' ) . split ( ',' ) )
|
||||||
|
{
|
||||||
|
let _account_settings = getAccountSettings ( server );
|
||||||
|
let row = new Gtk.ListBoxRow ( { hexpand: true,
|
||||||
|
halign: Gtk.Align.FILL } );
|
||||||
|
row.server= server
|
||||||
|
let _label = new Gtk.Label ( { label: _account_settings.get_string('name'),
|
||||||
|
hexpand: true,
|
||||||
|
margin: 5,
|
||||||
|
halign: Gtk.Align.START,
|
||||||
|
expand: true } );
|
||||||
|
row.add ( _label );
|
||||||
|
_label.set_data ( 'server', GLib.strdup(server) );
|
||||||
|
accountsChooser.add ( row );
|
||||||
|
}
|
||||||
|
accountsChooser.connect('row-activated', Lang.bind(this, function () {
|
||||||
|
let _row = accountsChooser.get_selected_row();
|
||||||
|
log('Active:' + _row.server);
|
||||||
|
let _account_settings = getAccountSettings ( _row.server );
|
||||||
|
|
||||||
|
for ( var prefEntry of prefs )
|
||||||
|
{
|
||||||
|
if ( prefEntry.type == Gtk.Entry )
|
||||||
|
{
|
||||||
|
// How to unbind previous one?
|
||||||
|
_account_settings.bind (
|
||||||
|
prefEntry.key,
|
||||||
|
this.prefWidgets[prefEntry.key],
|
||||||
|
'text',
|
||||||
|
Gio.SettingsBindFlags.DEFAULT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if ( prefEntry.type == Gtk.ComboBoxText )
|
||||||
|
{
|
||||||
|
this.prefWidgets[prefEntry.key].set_active(_account_settings.get_enum('type'));
|
||||||
|
this.prefWidgets[prefEntry.key].connect('changed', Lang.bind(this, function () {
|
||||||
|
log('Active:' + this.prefWidgets[prefEntry.key].get_active());
|
||||||
|
_account_settings.set_enum('type', this.prefWidgets[prefEntry.key].get_active());
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ) );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let accountsChooserActionBar = new Gtk.ActionBar ( { visible: true,
|
||||||
|
valign: Gtk.Align.END,
|
||||||
|
vexpand: false} );
|
||||||
|
accountsChooserContainer.pack_start(accountsChooserActionBar, true, true, 0);
|
||||||
|
|
||||||
|
let accountsWidget = new Gtk.Grid ( {
|
||||||
|
halign: Gtk.Align.FILL,
|
||||||
|
margin: 18,
|
||||||
|
column_spacing: 12,
|
||||||
|
row_spacing: 12,
|
||||||
|
visible: true,
|
||||||
|
column_homogeneous: false,
|
||||||
|
});
|
||||||
|
accountsWidgetContainer.pack_start(accountsWidget, true, true, 0);
|
||||||
|
|
||||||
|
let y = 1;
|
||||||
|
for ( var prefEntry of prefs )
|
||||||
|
{
|
||||||
|
let _label = new Gtk.Label({
|
||||||
|
label: prefEntry.label + ':',
|
||||||
|
visible: true,
|
||||||
|
halign: Gtk.Align.START,
|
||||||
|
});
|
||||||
|
accountsWidget.attach ( _label, 0, y, 1, 1 );
|
||||||
|
|
||||||
|
this.prefWidgets[prefEntry.key] = new prefEntry.type({
|
||||||
|
halign: Gtk.Align.FILL,
|
||||||
|
visible: true,
|
||||||
|
hexpand: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
let boundValue = 'text';
|
||||||
|
if ( prefEntry.key == 'password' )
|
||||||
|
{
|
||||||
|
this.prefWidgets[prefEntry.key].set_input_purpose ( Gtk.InputPurpose.PASSWORD );
|
||||||
|
this.prefWidgets[prefEntry.key].set_visibility ( false );
|
||||||
|
}
|
||||||
|
else if ( prefEntry.key == 'type' )
|
||||||
|
{
|
||||||
|
[ 'Icinga', 'Icinga2' ].forEach((item) => {
|
||||||
|
this.prefWidgets[prefEntry.key].append_text(item);
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
accountsWidget.attach(this.prefWidgets[prefEntry.key], 1, y, 1, 1);
|
||||||
|
|
||||||
|
if ( prefEntry.type != Gtk.ComboBoxText )
|
||||||
|
{
|
||||||
|
// this.account_settings.bind(
|
||||||
|
// prefEntry.key,
|
||||||
|
// _entry,
|
||||||
|
// boundValue,
|
||||||
|
// Gio.SettingsBindFlags.DEFAULT
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
mainVbox.pack_start(mainWidget, true, true, 0);
|
||||||
|
mainVbox.show_all();
|
||||||
|
|
||||||
|
return mainVbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccountSettings ( id )
|
||||||
|
{
|
||||||
|
let _path = SETTINGS_SCHEMA_ACCOUNT_PATH + '/' + id;
|
||||||
|
return Convenience.getSettings(SETTINGS_SCHEMA_ACCOUNT, _path);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
<schemalist >
|
||||||
|
<enum id="org.gnome.shell.extensions.monito@drieu.org.MonitoringType">
|
||||||
|
<value value="0" nick="Icinga"/>
|
||||||
|
<value value="1" nick="Icinga2"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<enum id="org.gnome.shell.extensions.monito@drieu.org.DisplayType">
|
||||||
|
<value value="0" nick="Short"/>
|
||||||
|
<value value="1" nick="Long"/>
|
||||||
|
</enum>
|
||||||
|
|
||||||
|
<!-- Main Schema -->
|
||||||
|
<schema id="org.gnome.shell.extensions.monito@drieu.org" path="/org/gnome/shell/extensions/monito/">
|
||||||
|
|
||||||
|
<child name="account" schema="org.gnome.shell.extensions.monito@drieu.org.account"/>
|
||||||
|
|
||||||
|
<key name="servers" type="s">
|
||||||
|
<default>'0'</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="display-type" enum="org.gnome.shell.extensions.monito@drieu.org.DisplayType">
|
||||||
|
<default>"Short"</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
</schema>
|
||||||
|
|
||||||
|
<!-- Account list -->
|
||||||
|
<schema id="org.gnome.shell.extensions.monito@drieu.org.account">
|
||||||
|
|
||||||
|
<key name="icon" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="type" enum="org.gnome.shell.extensions.monito@drieu.org.MonitoringType">
|
||||||
|
<default>"Icinga"</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="name" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="username" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="password" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="urlcgi" type="s">
|
||||||
|
<default>''</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
<key name="timeoutinterval" type="i">
|
||||||
|
<default>1</default>
|
||||||
|
</key>
|
||||||
|
|
||||||
|
</schema>
|
||||||
|
</schemalist>
|
62
stylesheet.css
Normal file
62
stylesheet.css
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* Add your custom extension styling here */
|
||||||
|
.panel-status-menu-box {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-services {
|
||||||
|
/* padding: 0px;
|
||||||
|
margin: 0px; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-box {
|
||||||
|
color: white;
|
||||||
|
border: 1px solid white;
|
||||||
|
padding: 0px .5em;
|
||||||
|
vertical-align: middle;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-critical-box, .monito-service-CRITICAL, .monito-service-line-CRITICAL {
|
||||||
|
background-color: #FF3300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-warning-box, .monito-service-WARNING, .monito-service-line-WARNING {
|
||||||
|
background-color: #ffa500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-ok-box, .monito-service-OK, .monito-service-line-OK {
|
||||||
|
background-color: #00CC33;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-unknown-box, .monito-service-UNKNOWN, .monito-service-line-UNKNOWN {
|
||||||
|
background-color: purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-service-line {
|
||||||
|
padding: 3px;
|
||||||
|
margin: 0px;
|
||||||
|
color: white;
|
||||||
|
border: 1px solid white;
|
||||||
|
vertical-align: middle;
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-title {
|
||||||
|
margin: 2px;
|
||||||
|
font-size: 200%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-label {
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monito-button-icon {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
padding: 12px !important;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user