====== Gnome - Extensions - VPN Indicator ======
Displays if the system is connected to a VPN or not.
----
===== Create the directory for the extension =====
mkdir ~/.local/share/gnome-shell/extensions/vpn-indicator
----
===== Create a metadata.json file =====
**metadata.json** is a mandatory file of the extension, containing information about the extension such as its UUID, name and description.
{
"description": "A VPN connection indicator.",
"name": "VPN Indicator",
"shell-version": [
"3.32",
"3.34",
"3.36",
"3.38",
"40"
],
"url": "",
"uuid": "vpn-indicator",
"version": 1
}
----
===== Create a extensions.js file =====
**extensions.js** is the core file of the extension and contains the function hooks **init()**, **enable()** and **disable()** used by GNOME Shell to load, enable and disable the extension.
const St = imports.gi.St;
const Main = imports.ui.main;
const Lang = imports.lang;
const Util = imports.misc.util;
const PanelMenu = imports.ui.panelMenu;
const Mainloop = imports.mainloop;
const GLib = imports.gi.GLib;
const Clutter = imports.gi.Clutter;
const VpnIndicator = new Lang.Class({
Name: 'VpnIndicator',
Extends: PanelMenu.Button,
_init: function() {
this.parent(0.0, "VPN Indicator", false);
if (!this.buttonText) {
this.buttonText = new St.Label({
text: _("Loading..."),
y_align: Clutter.ActorAlign.CENTER
});
}
this.actor.add_actor(this.buttonText);
this._refresh();
},
_checkVPN: function() {
let [res, out, err, exit] = GLib.spawn_sync(null, ["/bin/bash", "-c","ip addr | grep tun0"], null, GLib.SpawnFlags.SEARCH_PATH, null);
// To prevent /var/log/syslog filling with error messages once the object is destroyed.
try {
if (this.buttonText) {
if (exit == 256)
this.buttonText.set_text("VPN off");
else if (exit == 0)
this.buttonText.set_text("VPN on");
else
this.buttonText.set_text("VPN Error");
}
} catch (e) {
// logError(e, 'ExtensionError');
}
return exit;
},
_refresh: function() {
var qres = this._checkVPN();
//this._refreshUI(qres);
// Calls the refresh function every 2 seconds.
this._timeout = Mainloop.timeout_add_seconds(2, Lang.bind(this, this._refresh));
},
_refreshUI: function(data) {
/*
var text;
if (data == 256) {
text = "VPN is down!";
} else if (data == 0) {
text = "VPN is up!";
} else {
text = "Error!";
}
// To prevent /var/log/syslog filling with error messages once the object is destroyed.
try {
if (this.buttonText) {
this.buttonText.set_text(text);
}
} catch (e) {
// logError(e, 'ExtensionError');
}
*/
}
});
let twMenu;
function init() {
}
function enable() {
twMenu = new VpnIndicator;
Main.panel.addToStatusArea('vpn-indicator', twMenu);
}
function disable() {
if (this._timeout)
Mainloop.source_remove(this._timeout);
this._timeout = undefined;
if (this.buttonText !== null) {
this.buttonText.destroy();
this.buttonText = null;
}
twMenu.destroy();
}
----
===== Reload GNOME to pick up the extension =====
Press **Alt+F2**, and enter **r** and press **ENTER** to restart GNOME Shell.
----
===== References =====
https://extensions.gnome.org/
http://smasue.github.io/gnome-shell-tw