diff --git a/daemon/tasks/nodemonitor/main.go b/daemon/tasks/nodemonitor/main.go
new file mode 100644
index 00000000..225d9f71
--- /dev/null
+++ b/daemon/tasks/nodemonitor/main.go
@@ -0,0 +1,122 @@
+package nodemonitor
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "syscall"
+ "time"
+ "unsafe"
+
+ "github.com/evilsocket/opensnitch/daemon/log"
+ "github.com/evilsocket/opensnitch/daemon/tasks"
+)
+
+// Name of this task
+var Name = "node-monitor"
+
+// Config of this task
+type Config struct {
+ Interval string
+ Name string
+}
+
+// NodeMonitor monitors the resources of a node (ram, swap, load avg, etc).
+type NodeMonitor struct {
+ tasks.TaskBase
+ Ticker *time.Ticker
+
+ Interval string
+ Node string
+}
+
+// New returns a new NodeMonitor
+func New(node, interval string, stopOnDisconnect bool) (string, *NodeMonitor) {
+ return fmt.Sprint(Name, "-", node), &NodeMonitor{
+ TaskBase: tasks.TaskBase{
+ Results: make(chan interface{}),
+ Errors: make(chan error),
+ StopChan: make(chan struct{}),
+ },
+ Node: node,
+ Interval: interval,
+ }
+}
+
+// Start ...
+func (pm *NodeMonitor) Start(ctx context.Context, cancel context.CancelFunc) error {
+ pm.Ctx = ctx
+ pm.Cancel = cancel
+
+ if pm.Interval == "" {
+ pm.Interval = "5s"
+ }
+ interval, err := time.ParseDuration(pm.Interval)
+ if err != nil {
+ return err
+ }
+ pm.Ticker = time.NewTicker(interval)
+ go func(ctx context.Context) {
+ var info syscall.Sysinfo_t
+ for {
+ select {
+ case <-pm.StopChan:
+ goto Exit
+ case <-ctx.Done():
+ goto Exit
+ case <-pm.Ticker.C:
+ // TODO:
+ // - filesystem stats
+ // - daemon status (mem && cpu usage, internal/debug pkg, etc)
+ err := syscall.Sysinfo(&info)
+ if err != nil {
+ pm.TaskBase.Errors <- err
+ continue
+ }
+ infoJSON, err := json.Marshal(info)
+ if err != nil {
+ pm.TaskBase.Errors <- err
+ continue
+ }
+ pm.TaskBase.Results <- unsafe.String(unsafe.SliceData(infoJSON), len(infoJSON))
+ }
+ }
+ Exit:
+ log.Debug("[tasks.NodeMonitor] stopped (%s)", pm.Node)
+ }(ctx)
+ return err
+}
+
+// Pause stops temporarily the task. For example it might be paused when the
+// connection with the GUI (server) is closed.
+func (pm *NodeMonitor) Pause() error {
+ // TODO
+ return nil
+}
+
+// Resume stopped tasks.
+func (pm *NodeMonitor) Resume() error {
+ // TODO
+ return nil
+}
+
+// Stop ...
+func (pm *NodeMonitor) Stop() error {
+ if pm.StopOnDisconnect {
+ return nil
+ }
+ pm.Cancel()
+ close(pm.TaskBase.Results)
+ close(pm.TaskBase.Errors)
+ return nil
+}
+
+// Results ...
+func (pm *NodeMonitor) Results() <-chan interface{} {
+ return pm.TaskBase.Results
+}
+
+// Errors ...
+func (pm *NodeMonitor) Errors() <-chan error {
+ return pm.TaskBase.Errors
+}
diff --git a/daemon/ui/notifications.go b/daemon/ui/notifications.go
index 5e9b7a58..c3b9e3e7 100644
--- a/daemon/ui/notifications.go
+++ b/daemon/ui/notifications.go
@@ -15,6 +15,7 @@ import (
"github.com/evilsocket/opensnitch/daemon/procmon/monitor"
"github.com/evilsocket/opensnitch/daemon/rule"
"github.com/evilsocket/opensnitch/daemon/tasks"
+ "github.com/evilsocket/opensnitch/daemon/tasks/nodemonitor"
"github.com/evilsocket/opensnitch/daemon/tasks/pidmonitor"
"github.com/evilsocket/opensnitch/daemon/ui/config"
"github.com/evilsocket/opensnitch/daemon/ui/protocol"
@@ -58,6 +59,33 @@ func (c *Client) getClientConfig() *protocol.ClientConfig {
}
}
+func (c *Client) monitorNode(node, interval string, stream protocol.UI_NotificationsClient, notification *protocol.Notification) {
+ taskName, nodeMonTask := nodemonitor.New(node, interval, true)
+ ctxNode, err := TaskMgr.AddTask(taskName, nodeMonTask)
+ if err != nil {
+ c.sendNotificationReply(stream, notification.Id, "", err)
+ return
+ }
+ go func(ctx context.Context) {
+ for {
+ select {
+ case <-ctx.Done():
+ goto Exit
+ case err := <-nodeMonTask.Errors():
+ c.sendNotificationReply(stream, notification.Id, "", err)
+ case temp := <-nodeMonTask.Results():
+ data, ok := temp.(string)
+ if !ok {
+ goto Exit
+ }
+ c.sendNotificationReply(stream, notification.Id, data, nil)
+ }
+ }
+ Exit:
+ TaskMgr.RemoveTask(taskName)
+ }(ctxNode)
+}
+
func (c *Client) monitorProcessDetails(pid int, interval string, stream protocol.UI_NotificationsClient, notification *protocol.Notification) {
if !core.Exists(fmt.Sprint("/proc/", pid)) {
c.sendNotificationReply(stream, notification.Id, "", fmt.Errorf("The process is no longer running"))
@@ -185,6 +213,8 @@ func (c *Client) handleActionTaskStart(stream protocol.UI_NotificationsClient, n
return
}
c.monitorProcessDetails(pid, taskConf.Data["interval"], stream, notification)
+ case nodemonitor.Name:
+ c.monitorNode(taskConf.Data["node"], taskConf.Data["interval"], stream, notification)
default:
log.Debug("TaskStart, unknown task: %v", taskConf)
//c.sendNotificationReply(stream, notification.Id, "", err)
@@ -208,6 +238,8 @@ func (c *Client) handleActionTaskStop(stream protocol.UI_NotificationsClient, no
return
}
TaskMgr.RemoveTask(fmt.Sprint(taskConf.Name, "-", pid))
+ case nodemonitor.Name:
+ TaskMgr.RemoveTask(fmt.Sprint(nodemonitor.Name, "-", taskConf.Data["node"]))
default:
log.Debug("TaskStop, unknown task: %v", taskConf)
//c.sendNotificationReply(stream, notification.Id, "", err)
diff --git a/ui/opensnitch/config.py b/ui/opensnitch/config.py
index d4ae3030..a1a09fdf 100644
--- a/ui/opensnitch/config.py
+++ b/ui/opensnitch/config.py
@@ -140,6 +140,7 @@ class Config:
STATS_RULES_TREE_EXPANDED_0 = "statsDialog/rules_tree_0_expanded"
STATS_RULES_TREE_EXPANDED_1 = "statsDialog/rules_tree_1_expanded"
STATS_RULES_SPLITTER_POS = "statsDialog/rules_splitter_pos"
+ STATS_NODES_SPLITTER_POS = "statsDialog/nodes_splitter_pos"
STATS_VIEW_COL_STATE = "statsDialog/view_columns_state"
STATS_VIEW_DETAILS_COL_STATE = "statsDialog/view_details_columns_state"
diff --git a/ui/opensnitch/dialogs/stats.py b/ui/opensnitch/dialogs/stats.py
index 8967412f..35062f3e 100644
--- a/ui/opensnitch/dialogs/stats.py
+++ b/ui/opensnitch/dialogs/stats.py
@@ -4,6 +4,7 @@ import sys
import os
import csv
import io
+import json
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from PyQt5.QtCore import QCoreApplication as QC
@@ -56,6 +57,16 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
COL_RULES = 7
GENERAL_COL_NUM = 8
+ # nodes
+ COL_N_STATUS = 2
+ COL_N_HOSTNAME = 3
+ COL_N_VERSION = 4
+ COL_N_UPTIME = 5
+ COL_N_RULES = 6
+ COL_N_CONNECTIONS = 7
+ COL_N_DROPPED = 8
+ COL_N_KERNEL = 9
+
# stats
COL_WHAT = 0
@@ -130,10 +141,6 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
TAB_FIREWALL: False,
TAB_ALERTS: False
}
- # restore scrollbar position when going back from a detail view
- LAST_SCROLL_VALUE = None
- # try to restore last selection
- LAST_SELECTED_ITEM = ""
TABLES = {
TAB_MAIN: {
@@ -357,6 +364,12 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self.FIREWALL_DISABLED = QC.translate("stats", "Disabled")
self.FIREWALL_RUNNING = QC.translate("stats", "Running")
+ # restore scrollbar position when going back from a detail view
+ self.LAST_SCROLL_VALUE = None
+ # try to restore last selection
+ self.LAST_SELECTED_ITEM = ""
+ self.LAST_TAB = 0
+
self._db = db
self._db_sqlite = self._db.get_db()
self._db_name = dbname
@@ -406,6 +419,8 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self.nodeLabel.setStyleSheet('color: green;font-size:12pt; font-weight:600;')
self.rulesSplitter.setStretchFactor(0,0)
self.rulesSplitter.setStretchFactor(1,2)
+ self.nodesSplitter.setStretchFactor(0,0)
+ self.nodesSplitter.setStretchFactor(0,3)
self.rulesTreePanel.resizeColumnToContents(0)
self.rulesTreePanel.resizeColumnToContents(1)
self.rulesTreePanel.itemExpanded.connect(self._cb_rules_tree_item_expanded)
@@ -424,7 +439,8 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self.limitCombo.currentIndexChanged.connect(self._cb_limit_combo_changed)
self.tabWidget.currentChanged.connect(self._cb_tab_changed)
self.delRuleButton.clicked.connect(self._cb_del_rule_clicked)
- self.rulesSplitter.splitterMoved.connect(self._cb_rules_splitter_moved)
+ self.rulesSplitter.splitterMoved.connect(lambda pos, index: self._cb_splitter_moved(self.TAB_RULES, pos, index))
+ self.nodesSplitter.splitterMoved.connect(lambda pos, index: self._cb_splitter_moved(self.TAB_NODES, pos, index))
self.rulesTreePanel.itemClicked.connect(self._cb_rules_tree_item_clicked)
self.rulesTreePanel.itemDoubleClicked.connect(self._cb_rules_tree_item_double_clicked)
self.enableRuleCheck.clicked.connect(self._cb_enable_rule_toggled)
@@ -644,6 +660,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self.TABLES[idx]['label'].setStyleSheet('color: blue; font-size:9pt; font-weight:600;')
self.TABLES[idx]['label'].setVisible(False)
self.TABLES[idx]['view'].doubleClicked.connect(self._cb_table_double_clicked)
+ self.TABLES[idx]['view'].selectionModel().selectionChanged.connect(self._cb_table_selection_changed)
self.TABLES[idx]['view'].installEventFilter(self)
self.TABLES[self.TAB_FIREWALL]['view'].rowsReordered.connect(self._cb_fw_table_rows_reordered)
@@ -809,8 +826,20 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
elif len(rulesSizes) > 0:
self.comboRulesFilter.setVisible(rulesSizes[0] == 0)
else:
+ # default position when the user hasn't moved it.
w = self.rulesSplitter.width()
- self.rulesSplitter.setSizes([int(w/3), int(w/2)])
+ self.rulesSplitter.setSizes([int(w/2), int(w/4)])
+
+ nodes_splitter_pos = self._cfg.getSettings(Config.STATS_NODES_SPLITTER_POS)
+ if type(nodes_splitter_pos) == QtCore.QByteArray:
+ self.nodesSplitter.restoreState(nodes_splitter_pos)
+ nodesSizes = self.nodesSplitter.sizes()
+ self.nodesSplitter.setVisible(not self.IN_DETAIL_VIEW[self.TAB_NODES] and nodesSizes[0] > 0)
+ #elif len(rulesSizes) > 0:
+ # self.comboRulesFilter.setVisible(rulesSizes[0] == 0)
+ else:
+ w = self.nodesSplitter.width()
+ self.nodesSplitter.setSizes([int(w/2), int(w/3)])
self._restore_details_view_columns(self.eventsTable.horizontalHeader(), Config.STATS_GENERAL_COL_STATE)
self._restore_details_view_columns(self.nodesTable.horizontalHeader(), Config.STATS_NODES_COL_STATE)
@@ -1471,6 +1500,11 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
@QtCore.pyqtSlot(ui_pb2.NotificationReply)
def _cb_notification_callback(self, reply):
if reply.id in self._notifications_sent:
+ noti = self._notifications_sent[reply.id]
+ if noti.type == ui_pb2.TASK_START and reply.code != ui_pb2.ERROR:
+ self._update_node_info(reply.data)
+ return
+
if reply.code == ui_pb2.ERROR:
Message.ok(
QC.translate("stats", "Error:"),
@@ -1488,6 +1522,9 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
def _cb_tab_changed(self, index):
self.comboAction.setVisible(index == self.TAB_MAIN)
+ if self.LAST_TAB == self.TAB_NODES and self.LAST_SELECTED_ITEM != "":
+ self._unmonitor_deselected_node(self.LAST_SELECTED_ITEM)
+
self.TABLES[index]['cmdCleanStats'].setVisible(True)
if index == self.TAB_MAIN:
self._set_events_query()
@@ -1504,6 +1541,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
elif index == self.TAB_NODES:
self.TABLES[index]['cmdCleanStats'].setVisible( self.IN_DETAIL_VIEW[index] )
+ self.LAST_TAB = index
self._refresh_active_table()
def _cb_table_context_menu(self, pos):
@@ -1686,6 +1724,27 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
"{0}{1}".format(Config.STATS_VIEW_DETAILS_COL_STATE, cur_idx)
)
+ def _cb_table_selection_changed(self, selected, deselected):
+ cur_idx = self.tabWidget.currentIndex()
+ if cur_idx == self.TAB_NODES:
+ if not deselected.isEmpty():
+ self.LAST_SELECTED_ITEM = ""
+ last_addr = deselected.indexes()[self.COL_NODE].data()
+ self._unmonitor_deselected_node(last_addr)
+
+ if not selected.isEmpty():
+ node_addr = selected.indexes()[self.COL_NODE].data()
+ if node_addr == self.LAST_SELECTED_ITEM:
+ return
+ self.LAST_SELECTED_ITEM = node_addr
+ self._monitor_selected_node(
+ node_addr,
+ selected.indexes()[self.COL_N_UPTIME].data(),
+ selected.indexes()[self.COL_N_HOSTNAME].data(),
+ selected.indexes()[self.COL_N_VERSION].data(),
+ selected.indexes()[self.COL_N_KERNEL].data()
+ )
+
def _cb_table_double_clicked(self, row):
cur_idx = self.tabWidget.currentIndex()
if self.IN_DETAIL_VIEW[cur_idx]:
@@ -1831,9 +1890,15 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self._set_rules_filter(parent_row, item_row, item.text(0), node_addr, fw_table)
- def _cb_rules_splitter_moved(self, pos, index):
- self.comboRulesFilter.setVisible(pos == 0)
- self._cfg.setSettings(Config.STATS_RULES_SPLITTER_POS, self.rulesSplitter.saveState())
+ def _cb_splitter_moved(self, tab, pos, index):
+ if tab == self.TAB_RULES:
+ self.comboRulesFilter.setVisible(pos == 0)
+ self._cfg.setSettings(Config.STATS_RULES_SPLITTER_POS, self.rulesSplitter.saveState())
+ elif tab == self.TAB_NODES:
+ #w = self.nodesSplitter.width()
+ #if pos >= w-2:
+ # self._unmonitor_deselected_node()
+ self._cfg.setSettings(Config.STATS_NODES_SPLITTER_POS, self.nodesSplitter.saveState())
def _cb_start_clicked(self):
if self.daemon_connected == False:
@@ -2200,7 +2265,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
col = self.TAB_RULES
#self.TABLES[cur_idx]['view'].selectItem(self.LAST_SELECTED_ITEM, col)
- self.LAST_SELECTED_ITEM = ""
+ #self.LAST_SELECTED_ITEM = ""
def _restore_scroll_value(self):
if self.LAST_SCROLL_VALUE != None:
@@ -2303,6 +2368,8 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self.setQuery(model, qstr)
def _set_nodes_query(self, data):
+ if data != self.LAST_SELECTED_ITEM:
+ self._monitor_selected_node(data, "", "", "", "")
model = self._get_active_table().model()
self.setQuery(model, "SELECT " \
@@ -2359,6 +2426,150 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
return qstr
+ def _reset_node_info(self, status=""):
+ # value 0 is continuous progress
+ self.nodeRAMProgress.setMaximum(1)
+ self.nodeRAMProgress.setValue(0)
+ self.labelNodeProcs.setText("")
+ self.labelNodeLoadAvg.setText("")
+ self.labelNodeUptime.setText("")
+ self.labelNodeSwap.setText("")
+ self.labelNodeRAM.setText(status)
+
+ def _monitor_selected_node(self, node_addr, col_uptime, col_hostname, col_version, col_kernel):
+ # TODO:
+ # - create a tasks package, to centralize/normalize tasks' names and
+ # config
+ if not self._nodes.is_connected(node_addr):
+ self._reset_node_info(QC.translate("stats", "node not connected"))
+ else:
+ noti = ui_pb2.Notification(
+ clientName="",
+ serverName="",
+ type=ui_pb2.TASK_START,
+ data='{"name": "node-monitor", "data": {"node": "%s", "interval": "5s"}}' % node_addr,
+ rules=[])
+ nid = self._nodes.send_notification(
+ node_addr, noti, self._notification_callback
+ )
+ if nid != None:
+ self._notifications_sent[nid] = noti
+
+ self.nodeRAMProgress.setMaximum(0)
+ self.nodeSwapProgress.setMaximum(0)
+ self.labelNodeName.setText(QC.translate("stats", "loading node information..."))
+ self.labelNodeName.setText("
{0}
".format(col_hostname))
+ self.labelNodeDetails.setText(
+ QC.translate(
+ "stats",
+ "daemon uptime: {0}
".format(col_uptime) + \
+ "Version: {0}
".format(col_version) + \
+ "Kernel: {0}
".format(col_kernel)
+ )
+ )
+
+ def _unmonitor_deselected_node(self, last_addr):
+ if not self._nodes.is_connected(last_addr):
+ self._reset_node_info(QC.translate("stats", "node not connected"))
+ else:
+ noti = ui_pb2.Notification(
+ clientName="",
+ serverName="",
+ type=ui_pb2.TASK_STOP,
+ data='{"name": "node-monitor", "data": {"node": "%s", "interval": "5s"}}' % last_addr,
+ rules=[])
+ nid = self._nodes.send_notification(
+ last_addr, noti, self._notification_callback
+ )
+ if nid != None:
+ self._notifications_sent[nid] = noti
+ self.labelNodeDetails.setText("")
+
+ def _update_node_info(self, data):
+ try:
+ # TODO: move to .utils
+ def formatUptime(uptime):
+ hours = uptime / 3600
+ minutes = uptime % 3600 / 60
+ #seconds = uptime % 60
+ days = (uptime / 1440) / 60
+ months = 0
+ years = 0
+ if days > 0:
+ hours = hours % 24
+ minutes = (uptime % 3600) / 60
+
+ if days > 0:
+ uptime = "{0:.0f} days {1:.0f}h {2:.0f}m".format(days, hours, minutes)
+ else:
+ uptime = "{0:.0f}h {1:.0f}m".format(hours, minutes)
+
+ return QC.translate(
+ "stats",
+ "System uptime: %s" % uptime
+ )
+
+ # TODO: move to .utils
+ def bytes2units(value):
+ units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
+ idx = 0
+ while value / 1024 > 0:
+ value = value / 1024
+ idx+=1
+ if value < 1024:
+ break
+
+ return "{0:.0f} {1}".format(value, units [idx])
+
+ node_data = json.loads(data)
+ load1 = node_data['Loads'][0] / 100000
+ totalRam = node_data['Totalram']
+ totalSwap = node_data['Totalswap']
+ freeRam = totalRam - node_data['Freeram']
+ freeSwap = totalSwap - node_data['Freeswap']
+ self.nodeRAMProgress.setMaximum(int(totalRam/1000))
+ self.nodeRAMProgress.setValue(int(freeRam/1000))
+ self.nodeRAMProgress.setFormat("%p%")
+ self.nodeSwapProgress.setMaximum(int(totalSwap/1000))
+ self.nodeSwapProgress.setFormat("%p%")
+ self.nodeSwapProgress.setValue(int(freeSwap/1000))
+
+ # if any of these values is 0, set max progressbar value to 1, to
+ # avoid the "busy" effect:
+ # https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QProgressBar.html#detailed-description
+ if self.nodeRAMProgress.value() == 0:
+ self.nodeRAMProgress.setMaximum(1)
+ if self.nodeSwapProgress.value() == 0:
+ self.nodeSwapProgress.setMaximum(1)
+
+ ram = bytes2units(totalRam)
+ free = bytes2units(node_data['Freeram'])
+ swap = bytes2units(totalSwap)
+ freeSwap = bytes2units(node_data['Freeswap'])
+
+ self.labelNodeRAM.setText("RAM: {0} Free: {1}".format(ram, free))
+ self.labelNodeSwap.setText("Swap: {0} Free: {1}".format(swap, freeSwap))
+ self.labelNodeProcs.setText(
+ QC.translate("stats", "Processes: {0}".format(node_data['Procs']))
+ )
+ self.nodeRAMProgress.setFormat("%p%")
+ self.nodeSwapProgress.setFormat("%p%")
+ self.labelNodeLoadAvg.setText(
+ QC.translate(
+ "stats",
+ "Load avg: {0:.2f}, {1:.2f}, {2:.2f}".format(
+ node_data['Loads'][0] / 100000,
+ node_data['Loads'][1] / 100000,
+ node_data['Loads'][2] / 100000
+ )
+ )
+
+ )
+ self.labelNodeUptime.setText(formatUptime(node_data['Uptime']))
+ except Exception as e:
+ print("exception parsing taskStart data:", e, data)
+ # TODO: update nodes tab
+
def _update_nodes_interception_status(self, show=True, disable=False):
addr = self.TABLES[self.TAB_NODES]['label'].text()
node_cfg = self._nodes.get_node(addr)
diff --git a/ui/opensnitch/nodes.py b/ui/opensnitch/nodes.py
index 82da5084..b7ee7dcd 100644
--- a/ui/opensnitch/nodes.py
+++ b/ui/opensnitch/nodes.py
@@ -160,7 +160,7 @@ class Nodes(QObject):
def get_node(self, addr):
try:
return self._nodes[addr]
- except Exception as e:
+ except:
return None
def get_nodes(self):
@@ -195,6 +195,13 @@ class Nodes(QObject):
print(self.LOG_TAG, "get_addr() error getting addr:", peer)
return peer
+ def is_connected(self, addr):
+ try:
+ nd = self.get_node(addr)
+ return nd != None or (nd in self._nodes and self._nodes[nd]['online'] == True)
+ except:
+ return None
+
def is_local(self, addr):
if addr.startswith("unix"):
return True
diff --git a/ui/opensnitch/res/stats.ui b/ui/opensnitch/res/stats.ui
index a32a3159..53c5747b 100644
--- a/ui/opensnitch/res/stats.ui
+++ b/ui/opensnitch/res/stats.ui
@@ -67,6 +67,219 @@
4
+ -
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
-
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+ -
+
+
+
+ 32
+ 32
+
+
+
+ Create a new rule
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 60
+ 20
+
+
+
+
+ -
+
+
+ <html><head/><body><p><span style=" font-size:11pt; font-weight:600;">hostname - 192.168.1.1</span></p></body></html>
+
+
+ 5
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 11
+ 75
+ true
+ true
+
+
+
+ Status
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ 5
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 11
+ true
+
+
+
+ -
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ 5
+
+
+
+ -
+
+
+ Start or Stop interception
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+
-
@@ -78,13 +291,13 @@
0
-
- true
+
+ Qt::ElideRight
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Events
@@ -155,25 +368,13 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Nodes
-
-
- 0
-
-
- 9
-
-
- 0
-
-
- 0
-
-
-
+
+
-
-
@@ -182,7 +383,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -222,7 +423,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -239,7 +440,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -256,7 +457,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -273,7 +474,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -285,57 +486,214 @@
- -
-
-
- 0
+
-
+
+
+
+ 0
+ 0
+
-
-
-
-
- QFrame::NoFrame
+
+ Qt::Horizontal
+
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
-
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ false
+
+
+ QAbstractItemView::SelectRows
+
+
+ false
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+
+
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 336
+ 404
+
-
- QFrame::Plain
-
-
- false
-
-
- QAbstractItemView::SelectRows
-
-
- false
-
-
- true
-
-
- true
-
-
- false
-
-
- false
-
+
+ -
+
+
+ <h3>Node</h3>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ RAM, Free: , Total:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 1
+
+
+ 1
+
+
+ %p%
+
+
+
+ -
+
+
+ Swap, Free: , Total:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0
+
+
+ %p%
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Processes:
+
+
+
+ -
+
+
+ Load average: 0.0, 0.0, 0.0
+
+
+
+ -
+
+
+ Uptime:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ daemon:
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 17
+ 165
+
+
+
+
+
-
- -
-
-
- Qt::Vertical
-
-
-
-
+
+
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Rules
@@ -391,7 +749,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
-
@@ -404,7 +762,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
-
@@ -418,7 +776,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
@@ -428,7 +786,7 @@
- ../../../../../../.designer/backup../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../.designer/backup
-
@@ -444,7 +802,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../gustavo-iniguez-goya/opensnitch/ui/opensnitch/res
-
@@ -459,7 +817,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -554,7 +912,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
@@ -563,7 +921,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
@@ -572,7 +930,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
@@ -581,7 +939,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -612,7 +970,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -656,7 +1014,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -673,7 +1031,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -687,7 +1045,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Hosts
@@ -711,7 +1069,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -780,7 +1138,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Applications
@@ -807,7 +1165,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -837,7 +1195,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
true
@@ -896,7 +1254,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Addresses
@@ -920,7 +1278,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -989,7 +1347,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Ports
@@ -1013,7 +1371,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -1076,7 +1434,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
Users
@@ -1100,7 +1458,7 @@
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
@@ -1162,6 +1520,200 @@
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 4
+
+
+ 2
+
+
+ 4
+
+
+ 4
+
+
-
+
+
+ Filter
+
+
+
+ -
+
+
-
+
+ -
+
+
+ -
+
+ Allow
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ -
+
+ Deny
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ -
+
+ Reject
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+
+
+ -
+
+
+
+
+
+ true
+
+
+ Ex.: firefox
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Minimum
+
+
+
+ 20
+ 20
+
+
+
+
+ -
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+
+ -
+
+
+ 0
+
+
+
+ -
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+
+ -
+
+
+ 0
+
+
+ QComboBox::AdjustToContents
+
+
-
+
+ 50
+
+
+ -
+
+ 100
+
+
+ -
+
+ 200
+
+
+ -
+
+ 300
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ Delete all intercepted events
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+
+ ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
+
+
+ true
+
+
+
+
+
+
-
@@ -1377,6 +1929,13 @@
+ -
+
+
+ -
+
+
+
-
@@ -1447,413 +2006,6 @@
- -
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
- -
-
-
-
- 32
- 32
-
-
-
- Create a new rule
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
- -
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 60
- 20
-
-
-
-
- -
-
-
- <html><head/><body><p><span style=" font-size:11pt; font-weight:600;">hostname - 192.168.1.1</span></p></body></html>
-
-
- 5
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 11
- 75
- true
- true
-
-
-
- Status
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
- 5
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 11
- true
-
-
-
- -
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
- 5
-
-
-
- -
-
-
- Start or Stop interception
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
- false
-
-
- true
-
-
-
-
-
-
-
-
- -
-
-
- QFrame::NoFrame
-
-
- QFrame::Raised
-
-
-
- 4
-
-
- 2
-
-
- 4
-
-
- 4
-
-
-
-
-
- Filter
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
- Allow
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- -
-
- Deny
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- -
-
- Reject
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
-
-
- -
-
-
-
-
-
- true
-
-
- Ex.: firefox
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Minimum
-
-
-
- 20
- 20
-
-
-
-
- -
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
-
- -
-
-
- 0
-
-
-
- -
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
-
- -
-
-
- 0
-
-
- QComboBox::AdjustToContents
-
-
-
-
- 50
-
-
- -
-
- 100
-
-
- -
-
- 200
-
-
- -
-
- 300
-
-
- -
-
-
-
-
-
-
- -
-
-
- Delete all intercepted events
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
- -
-
-
-
-
-
-
- ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup
-
-
- true
-
-
-
-
-
-