Merge branch 'ui2.0': allow to configure options from the UI

This commit is contained in:
Gustavo Iñiguez Goia 2020-04-19 20:54:34 +02:00
commit bf7449f303
11 changed files with 1868 additions and 544 deletions

View file

@ -11,6 +11,8 @@ class Config:
@staticmethod
def get():
if Config.__instance == None:
Config._instance = Config()
return Config.__instance
def __init__(self):
@ -30,6 +32,7 @@ class Config:
def setSettings(self, path, value):
self.settings.setValue(path, value)
self.settings.sync()
def getSettings(self, path):
return self.settings.value(path)

View file

@ -5,6 +5,9 @@ import sys
class Database:
__instance = None
DB_IN_MEMORY = ":memory:"
DB_TYPE_MEMORY = 0
DB_TYPE_FILE = 1
@staticmethod
def instance():
@ -15,17 +18,27 @@ class Database:
def __init__(self):
self._lock = threading.Lock()
self.db = None
self.db_name = Database.DB_IN_MEMORY
self.initialize()
def initialize(self):
self.db = QSqlDatabase.addDatabase("QSQLITE", "db")
self.db.setDatabaseName(":memory:")
self.db.setDatabaseName(self.db_name)
if not self.db.open():
print("\n ** Error opening DB: SQLite driver not loaded\n")
print("\n ** Error opening DB: SQLite driver not loaded. DB name: %s\n" % self.db_name)
print("\n Available drivers: ", QSqlDatabase.drivers())
sys.exit(-1)
self._create_tables()
def close(self):
self.db.close()
def set_db_name(self, dbname):
if dbname != "" and dbname != self.db_name:
self.close()
self.db_name = dbname
self.initialize()
def get_db(self):
return self.db
@ -39,6 +52,7 @@ class Database:
q.exec_()
q = QSqlQuery("create table if not exists connections (" \
"time text, " \
"node text, " \
"action text, " \
"protocol text, " \
"src_ip text, " \

View file

@ -0,0 +1,171 @@
import threading
import logging
import sys
import time
import os
import json
from datetime import datetime
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from config import Config
from database import Database
from nodes import Nodes
import ui_pb2
DIALOG_UI_PATH = "%s/../res/preferences.ui" % os.path.dirname(sys.modules[__name__].__file__)
class PreferencesDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
LOG_TAG = "[Preferences] "
_notification_trigger = QtCore.pyqtSignal(str, ui_pb2.Notification)
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent, QtCore.Qt.WindowStaysOnTopHint)
self._cfg = Config.get()
self._db = Database.instance()
self._nodes = Nodes.instance()
self.setupUi(self)
self._accept_button = self.findChild(QtWidgets.QPushButton, "acceptButton")
self._accept_button.clicked.connect(self._cb_accept_button_clicked)
self._apply_button = self.findChild(QtWidgets.QPushButton, "applyButton")
self._apply_button.clicked.connect(self._cb_apply_button_clicked)
self._cancel_button = self.findChild(QtWidgets.QPushButton, "cancelButton")
self._cancel_button.clicked.connect(self._cb_cancel_button_clicked)
self._default_timeout_button = self.findChild(QtWidgets.QSpinBox, "spinUITimeout")
self._default_action_combo = self.findChild(QtWidgets.QComboBox, "comboUIAction")
self._default_target_combo = self.findChild(QtWidgets.QComboBox, "comboUITarget")
self._default_duration_combo = self.findChild(QtWidgets.QComboBox, "comboUIDuration")
self._dialog_pos_combo = self.findChild(QtWidgets.QComboBox, "comboUIDialogPos")
self._nodes_combo = self.findChild(QtWidgets.QComboBox, "comboNodes")
self._node_action_combo = self.findChild(QtWidgets.QComboBox, "comboNodeAction")
self._node_duration_combo = self.findChild(QtWidgets.QComboBox, "comboNodeDuration")
self._node_monitor_method_combo = self.findChild(QtWidgets.QComboBox, "comboNodeMonitorMethod")
self._node_loglevel_combo = self.findChild(QtWidgets.QComboBox, "comboNodeLogLevel")
self._node_intercept_unknown_check = self.findChild(QtWidgets.QCheckBox, "checkInterceptUnknown")
self._node_name_label = self.findChild(QtWidgets.QLabel, "labelNodeName")
self._node_version_label = self.findChild(QtWidgets.QLabel, "labelNodeVersion")
self._node_apply_all_check = self.findChild(QtWidgets.QCheckBox, "checkApplyToNodes")
def showEvent(self, event):
super(PreferencesDialog, self).showEvent(event)
try:
self._nodes_combo.clear()
self._node_list = self._nodes.get()
for addr in self._node_list:
self._nodes_combo.addItem(addr)
if len(self._node_list) == 0:
self._reset_node_settings()
except Exception as e:
print(self.LOG_TAG + "exception loading nodes", e)
self._load_settings()
# connect the signals after loading settings, to avoid firing
# the signals
self._nodes_combo.currentIndexChanged.connect(self._cb_node_combo_changed)
self._node_action_combo.currentIndexChanged.connect(self._cb_node_needs_update)
self._node_duration_combo.currentIndexChanged.connect(self._cb_node_needs_update)
self._node_monitor_method_combo.currentIndexChanged.connect(self._cb_node_needs_update)
self._node_loglevel_combo.currentIndexChanged.connect(self._cb_node_needs_update)
self._node_intercept_unknown_check.clicked.connect(self._cb_node_needs_update)
self._node_apply_all_check.clicked.connect(self._cb_node_needs_update)
# True when any node option changes
self._node_needs_update = False
def _load_settings(self):
self._default_action = self._cfg.getSettings("global/default_action")
self._default_duration = self._cfg.getSettings("global/default_duration")
self._default_target = self._cfg.getSettings("global/default_target")
self._default_timeout = self._cfg.getSettings("global/default_timeout")
self._default_duration_combo.setCurrentText(self._default_duration)
self._default_action_combo.setCurrentText(self._default_action)
self._default_target_combo.setCurrentIndex(int(self._default_target))
self._default_timeout_button.setValue(int(self._default_timeout))
self._load_node_settings()
def _load_node_settings(self):
addr = self._nodes_combo.currentText()
if addr != "":
try:
node_data = self._node_list[addr]['data']
self._node_version_label.setText(node_data.version)
self._node_name_label.setText(node_data.name)
self._node_loglevel_combo.setCurrentIndex(node_data.logLevel)
node_config = json.loads(node_data.config)
self._node_action_combo.setCurrentText(node_config['DefaultAction'])
self._node_duration_combo.setCurrentText(node_config['DefaultDuration'])
self._node_monitor_method_combo.setCurrentText(node_config['ProcMonitorMethod'])
self._node_intercept_unknown_check.setChecked(node_config['InterceptUnknown'])
self._node_loglevel_combo.setCurrentIndex(int(node_config['LogLevel']))
except Exception as e:
print(self.LOG_TAG + "exception loading config: ", e)
def _reset_node_settings(self):
self._node_action_combo.setCurrentIndex(0)
self._node_duration_combo.setCurrentIndex(0)
self._node_monitor_method_combo.setCurrentIndex(0)
self._node_intercept_unknown_check.setChecked(False)
self._node_loglevel_combo.setCurrentIndex(0)
self._node_name_label.setText("")
self._node_version_label.setText("")
def _save_settings(self):
self._cfg.setSettings("global/default_action", self._default_action_combo.currentText())
self._cfg.setSettings("global/default_duration", self._default_duration_combo.currentText())
self._cfg.setSettings("global/default_target", self._default_target_combo.currentIndex())
self._cfg.setSettings("global/default_timeout", self._default_timeout_button.value())
addr = self._nodes_combo.currentText()
if (self._node_needs_update or self._node_apply_all_check.isChecked()) and addr != "":
try:
# TODO: move to Nodes()
node_config = "{\"DefaultAction\": \"" + self._node_action_combo.currentText() + "\"" \
+ ", \"DefaultDuration\": \"" + self._node_duration_combo.currentText() + "\"" \
+ ", \"ProcMonitorMethod\": \"" + self._node_monitor_method_combo.currentText() + "\"" \
+ ", \"InterceptUnknown\": " + str(self._node_intercept_unknown_check.isChecked()).lower() \
+ ", \"LogLevel\": " + str(self._node_loglevel_combo.currentIndex()) \
+ "}"
notif = ui_pb2.Notification(
type=ui_pb2.CHANGE_CONFIG,
data=node_config,
rules=[])
if self._node_apply_all_check.isChecked():
self._nodes.save_nodes_config(node_config)
self._nodes.send_notifications(notif)
else:
self._nodes.save_node_config(addr, node_config)
self._nodes.send_notification(addr, notif)
except Exception as e:
print(self.LOG_TAG + "exception saving config: ", e)
self._node_needs_update = False
def _cb_accept_button_clicked(self):
self._save_settings()
self.accept()
def _cb_apply_button_clicked(self):
self._save_settings()
def _cb_cancel_button_clicked(self):
self.reject()
def _cb_node_combo_changed(self, index):
self._load_node_settings()
def _cb_node_needs_update(self):
self._node_needs_update = True

View file

@ -169,10 +169,7 @@ class PromptDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self._duration_combo.setCurrentIndex(7)
def _render_connection(self, con):
if self._local:
app_name, app_icon, _ = self._apps_parser.get_info_by_path(con.process_path, "terminal")
else:
app_name, app_icon = "", "terminal"
app_name, app_icon, _ = self._apps_parser.get_info_by_path(con.process_path, "terminal")
if app_name == "":
app_name = "Unknown process"
@ -191,7 +188,7 @@ class PromptDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
con.protocol,
con.dst_port )
else:
message = "The process <b>%s</b> running on the computer <b>%s</b> is connecting to <b>%s</b> on %s port %d" % ( \
message = "<b>Remote</b> process <b>%s</b> running on <b>%s</b> is connecting to <b>%s</b> on %s port %d" % ( \
app_name,
self._peer.split(':')[1],
con.dst_host or con.dst_ip,

View file

@ -14,6 +14,7 @@ import ui_pb2
from database import Database
from config import Config
from version import version
from dialogs.preferences import PreferencesDialog
DIALOG_UI_PATH = "%s/../res/stats.ui" % os.path.dirname(sys.modules[__name__].__file__)
class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
@ -22,6 +23,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
_trigger = QtCore.pyqtSignal()
_shown_trigger = QtCore.pyqtSignal()
_notification_trigger = QtCore.pyqtSignal(ui_pb2.Notification)
SORT_ORDER = ["ASC", "DESC"]
LAST_ORDER_TO = 1
@ -36,7 +38,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
"tipLabel": None,
"cmd": None,
"view": None,
"display_fields": "time as Time, action as Action, dst_host || ' -> ' || dst_port as Destination, protocol as Protocol, process as Process, rule as Rule",
"display_fields": "time as Time, node as Node, action as Action, dst_host || ' -> ' || dst_port as Destination, protocol as Protocol, process as Process, rule as Rule",
"group_by": LAST_GROUP_BY
},
1: {
@ -107,6 +109,13 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self._stats = None
self._trigger.connect(self._on_update_triggered)
self._start_button = self.findChild(QtWidgets.QToolButton, "startButton")
self._start_button.clicked.connect(self._cb_start_clicked)
self._prefs_button = self.findChild(QtWidgets.QPushButton, "prefsButton")
self._prefs_button.clicked.connect(self._cb_prefs_clicked)
self._prefs_dialog = PreferencesDialog()
self._save_button = self.findChild(QtWidgets.QToolButton, "saveButton")
self._save_button.clicked.connect(self._on_save_clicked)
self._tabs = self.findChild(QtWidgets.QTabWidget, "tabWidget")
@ -186,12 +195,14 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
'users.csv'
)
if address is not None:
self.setWindowapply_Title("OpenSnitch Network Statistics for %s" % address)
def showEvent(self, event):
super(StatsDialog, self).showEvent(event)
self._shown_trigger.emit()
window_title = "OpenSnitch Network Statistics - %s " % version
if self._address is not None:
self.setWindowTitle("OpenSnitch Network Statistics for %s - %s" % (self._address, self._stats.daemon_version))
self.setWindowTitle(window_title)
def _load_settings(self):
dialog_geometry = self._cfg.getSettings("statsDialog/geometry")
@ -276,11 +287,11 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
data = row.data()
idx = row.column()
cur_idx = 1
if idx == 4:
if idx == 5:
cur_idx = 3
self._tabs.setCurrentIndex(cur_idx)
self._set_process_query(data)
elif idx == 5:
elif idx == 6:
self._tabs.setCurrentIndex(cur_idx)
self._set_rules_query(data)
@ -314,6 +325,26 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
elif cur_idx == 6:
self._set_users_query(data)
def _cb_prefs_clicked(self):
self._prefs_dialog.show()
def _cb_start_clicked(self):
if self.daemon_connected == False:
self._start_button.setChecked(False)
return
self._status_label.setStyleSheet('color: green')
# TODO: move to a new class
notType = ui_pb2.UNLOAD_FIREWALL
if self._start_button.isChecked():
self._status_label.setText("running")
notType = ui_pb2.LOAD_FIREWALL
else:
self._status_label.setText("running/disabled")
noti = ui_pb2.Notification(clientName="", serverName="", type=notType, data="", rules=[])
self._notification_trigger.emit(noti)
def _get_limit(self):
return " " + self.LIMITS[self._limit_combo.currentIndex()]
@ -348,6 +379,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
model = self._get_active_table().model()
self.setQuery(model, "SELECT " \
"c.time as Time, " \
"c.node as Node, " \
"c.action as Action, " \
"c.uid as UserID, " \
"c.protocol as Protocol, " \
@ -364,6 +396,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
model = self._get_active_table().model()
self.setQuery(model, "SELECT " \
"c.time as Time, " \
"c.node as Node, " \
"c.action as Action, " \
"c.uid as UserID, " \
"c.dst_host || ' -> ' || c.dst_port as Destination, " \
@ -372,7 +405,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
"count(c.dst_host) as Hits, " \
"c.rule as Rule " \
"FROM procs as p, connections as c " \
"WHERE p.what = c.process AND p.what = '%s' GROUP BY c.dst_host " % data)
"WHERE p.what = c.process AND p.what = '%s' GROUP BY c.node, c.dst_host " % data)
def _set_addrs_query(self, data):
model = self._get_active_table().model()
@ -409,6 +442,7 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
model = self._get_active_table().model()
self.setQuery(model, "SELECT " \
"c.time as Time, " \
"c.node as Node, " \
"c.action as Action, " \
"c.protocol as Protocol, " \
"c.dst_ip as DstIP, " \
@ -429,6 +463,9 @@ class StatsDialog(QtWidgets.QDialog, uic.loadUiType(DIALOG_UI_PATH)[0]):
self._trigger.emit()
def update_status(self):
self._start_button.setDown(self.daemon_connected)
self._start_button.setChecked(self.daemon_connected)
self._start_button.setDisabled(not self.daemon_connected)
if self.daemon_connected:
self._status_label.setText("running")
self._status_label.setStyleSheet('color: green')

112
ui/opensnitch/nodes.py Normal file
View file

@ -0,0 +1,112 @@
from queue import Queue
from datetime import datetime
class Nodes():
__instance = None
LOG_TAG = "[Nodes]: "
@staticmethod
def instance():
if Nodes.__instance == None:
Nodes.__instance = Nodes()
return Nodes.__instance
def __init__(self):
self._nodes = {}
def count(self):
return len(self._nodes)
def add(self, context, client_config=None):
try:
proto, addr = self.get_addr(context.peer())
addr = "%s:%s" % (proto, addr)
if addr not in self._nodes:
self._nodes[addr] = {
'notifications': Queue(),
'online': True,
'last_seen': datetime.now()
}
self.add_data(addr, client_config)
return self._nodes[addr]
self._nodes[addr]['last_seen'] = datetime.now()
self.add_data(addr, client_config)
return self._nodes[addr]
except Exception as e:
print(self.LOG_TAG + " exception adding/updating node: ", e, addr, client_config)
return None
def add_data(self, addr, client_config):
if client_config != None:
self._nodes[addr]['data'] = client_config
def delete_all(self):
self.send_notifications(None)
self._nodes = {}
def delete(self, peer):
proto, addr = self.get_addr(peer)
addr = "%s:%s" % (proto, addr)
# Force the node to get one new item from queue,
# in order to loop and exit.
self.send_notification(addr, None)
if addr in self._nodes:
del self._nodes[addr]
def get(self):
return self._nodes
def get_addr(self, peer):
peer = peer.split(":")
return peer[0], peer[1]
def get_notifications(self):
notlist = []
try:
for c in self._nodes:
if self._nodes[c]['online'] == False:
continue
if self._nodes[c]['notifications'].empty():
continue
notif = self._nodes[c]['notifications'].get(False)
if notif != None:
self._nodes[c]['notifications'].task_done()
notlist.append(notif)
except Exception as e:
print(self.LOG_TAG + " exception get_notifications(): ", e)
return notlist
def save_node_config(self, addr, config):
try:
self._nodes[addr]['data'].config = config
except Exception as e:
print(self.LOG_TAG + " exception saving node config: ", e, addr, config)
def save_nodes_config(self, config):
try:
for c in self._nodes:
self._nodes[c]['data'].config = config
except Exception as e:
print(self.LOG_TAG + " exception saving nodes config: ", e, config)
def send_notification(self, addr, notification):
try:
self._nodes[addr]['notifications'].put(notification)
except Exception as e:
print(self.LOG_TAG + " exception sending notification: ", e, addr, notification)
def send_notifications(self, notification):
"""
Enqueues a notification to the clients queue.
It'll be retrieved and delivered by get_notifications
"""
try:
for c in self._nodes:
self._nodes[c]['notifications'].put(notification)
except Exception as e:
print(self.LOG_TAG + " exception sending notifications: ", e, notification)

View file

@ -0,0 +1,637 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PreferencesDialog</class>
<widget class="QDialog" name="PreferencesDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>599</width>
<height>334</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cancelButton">
<property name="text">
<string>Cancel</string>
</property>
<property name="icon">
<iconset theme="window-close"/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="applyButton">
<property name="text">
<string>Apply</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="acceptButton">
<property name="text">
<string>Save</string>
</property>
<property name="icon">
<iconset theme="emblem-default"/>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="title">
<string>UI</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="3">
<widget class="QComboBox" name="comboUIDuration">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>once</string>
</property>
</item>
<item>
<property name="text">
<string>30s</string>
</property>
</item>
<item>
<property name="text">
<string>5m</string>
</property>
</item>
<item>
<property name="text">
<string>15m</string>
</property>
</item>
<item>
<property name="text">
<string>30m</string>
</property>
</item>
<item>
<property name="text">
<string>1h</string>
</property>
</item>
<item>
<property name="text">
<string>for this session</string>
</property>
</item>
<item>
<property name="text">
<string>forever</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Default target</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Default action</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Default duration</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QComboBox" name="comboUITarget">
<item>
<property name="text">
<string>by executable</string>
</property>
</item>
<item>
<property name="text">
<string>by command line</string>
</property>
</item>
<item>
<property name="text">
<string>by destination port</string>
</property>
</item>
<item>
<property name="text">
<string>by destination ip</string>
</property>
</item>
<item>
<property name="text">
<string>by user id</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QSpinBox" name="spinUITimeout">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="comboUIAction">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>deny</string>
</property>
<property name="icon">
<iconset theme="emblem-important"/>
</property>
</item>
<item>
<property name="text">
<string>allow</string>
</property>
<property name="icon">
<iconset theme="emblem-default"/>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Default timeout</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QComboBox" name="comboUIDialogPos">
<property name="enabled">
<bool>false</bool>
</property>
<item>
<property name="text">
<string>center</string>
</property>
</item>
<item>
<property name="text">
<string>top right</string>
</property>
</item>
<item>
<property name="text">
<string>bottom right</string>
</property>
</item>
<item>
<property name="text">
<string>top left</string>
</property>
</item>
<item>
<property name="text">
<string>bottom left</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Prompt dialog default position on screen</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Nodes</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="10" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Intercept Unknown Connections</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QComboBox" name="comboNodes">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Default duration</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QCheckBox" name="checkInterceptUnknown">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QComboBox" name="comboNodeMonitorMethod">
<item>
<property name="text">
<string>proc</string>
</property>
</item>
<item>
<property name="text">
<string>audit</string>
</property>
</item>
<item>
<property name="text">
<string>ftrace</string>
</property>
</item>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="labelNodeName">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Default action</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Version</string>
</property>
</widget>
</item>
<item row="8" column="0">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="checkApplyToNodes">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Apply configuration to all nodes</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="labelNodeVersion">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QComboBox" name="comboNodeDuration">
<item>
<property name="text">
<string>once</string>
</property>
</item>
<item>
<property name="text">
<string>until restart</string>
</property>
</item>
<item>
<property name="text">
<string>always</string>
</property>
</item>
</widget>
</item>
<item row="3" column="3">
<widget class="QComboBox" name="comboNodeAction">
<item>
<property name="text">
<string>deny</string>
</property>
<property name="icon">
<iconset theme="emblem-important"/>
</property>
</item>
<item>
<property name="text">
<string>allow</string>
</property>
<property name="icon">
<iconset theme="emblem-default"/>
</property>
</item>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Process monitor method</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Default log level</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>HostName</string>
</property>
</widget>
</item>
<item row="7" column="3">
<widget class="QComboBox" name="comboNodeLogLevel">
<item>
<property name="text">
<string>DEBUG</string>
</property>
</item>
<item>
<property name="text">
<string>INFO</string>
</property>
</item>
<item>
<property name="text">
<string>IMPORTANT</string>
</property>
</item>
<item>
<property name="text">
<string>WARNING</string>
</property>
</item>
<item>
<property name="text">
<string>ERROR</string>
</property>
</item>
<item>
<property name="text">
<string>FATAL</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Database</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3" rowstretch="0,0">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Database name</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="comboDBType">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>In memory</string>
</property>
</item>
<item>
<property name="text">
<string>File</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QLineEdit" name="lineFileDB">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="placeholderText">
<string>/path/to/the/file.db</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -40,7 +40,7 @@
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="0">
<item row="3" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
@ -50,344 +50,7 @@
<string>General</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_10">
<item row="0" column="2">
<layout class="QGridLayout" name="gridLayout_3">
<property name="rightMargin">
<number>0</number>
</property>
<item row="1" column="0">
<widget class="QLabel" name="consLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Dropped</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Connections</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="droppedLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0" colspan="3">
<widget class="QTreeView" name="eventsTable">
<property name="styleSheet">
<string notr="true">*[action=&quot;deny&quot;] { text-color: rgb(239, 41, 41);}
*[action=&quot;allow&quot;] { text-color: rgb(115, 210, 22);}</string>
</property>
<property name="autoScroll">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Version</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Uptime</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Status</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="daemonVerLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="uptimeLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Rules</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="rulesLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0" colspan="3">
<item row="1" column="1" colspan="4">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_4">
@ -409,7 +72,7 @@
</property>
<property name="icon">
<iconset theme="emblem-default">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</item>
<item>
@ -418,7 +81,7 @@
</property>
<property name="icon">
<iconset theme="emblem-important">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</item>
</widget>
@ -487,27 +150,26 @@
<string/>
</property>
<property name="icon">
<iconset theme="edit-clear"/>
<iconset theme="edit-clear">
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<item row="2" column="1" colspan="4">
<widget class="QTreeView" name="eventsTable">
<property name="styleSheet">
<string notr="true">*[action=&quot;deny&quot;] { text-color: rgb(239, 41, 41);}
*[action=&quot;allow&quot;] { text-color: rgb(115, 210, 22);}</string>
</property>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
<property name="autoScroll">
<bool>false</bool>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>50</width>
<height>20</height>
</size>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
</spacer>
</widget>
</item>
</layout>
</widget>
@ -541,7 +203,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -593,7 +255,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -680,7 +342,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -748,7 +410,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -813,7 +475,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -878,7 +540,7 @@
</property>
<property name="icon">
<iconset theme="back">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
<normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
@ -915,22 +577,422 @@
</widget>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Connections</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="consLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Dropped</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="droppedLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Uptime</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="uptimeLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Rules</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="rulesLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Version</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="daemonVerLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>DejaVu Sans</family>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QToolButton" name="saveButton">
<property name="toolTip">
<string>Save to CSV.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-save-as">
<normaloff>../../../../../../../../../../../../../../.designer/backup</normaloff>../../../../../../../../../../../../../../.designer/backup</iconset>
</property>
<property name="shortcut">
<string>Ctrl+S</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QToolButton" name="saveButton">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolTip">
<string>Save to CSV.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-save"/>
</property>
<property name="shortcut">
<string>Ctrl+S</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="prefsButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="preferences-desktop"/>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="startButton">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="media-playback-start"/>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Ubuntu</family>
<pointsize>11</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Status</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>

View file

@ -2,7 +2,8 @@ from PyQt5 import QtWidgets, QtGui, QtCore, Qt
from PyQt5.QtSql import QSqlDatabase, QSqlDatabase, QSqlQueryModel, QSqlQuery
from datetime import datetime
from threading import Thread, Lock
from threading import Thread, Lock, Event
from queue import Queue
import time
import os
import socket
@ -20,7 +21,9 @@ import ui_pb2_grpc
from dialogs.prompt import PromptDialog
from dialogs.stats import StatsDialog
from dialogs.preferences import PreferencesDialog
from nodes import Nodes
from database import Database
from config import Config
from version import version
@ -44,6 +47,7 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self._path = os.path.abspath(os.path.dirname(__file__))
self._app = app
self._on_exit = on_exit
self._exit = False
self._msg = QtWidgets.QMessageBox()
self._prompt_dialog = PromptDialog()
self._stats_dialog = StatsDialog()
@ -59,6 +63,8 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self.check_thread.daemon = True
self.check_thread.start()
self._nodes = Nodes.instance()
self.last_stats = None
# https://gist.github.com/pklaus/289646
@ -85,6 +91,7 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self._version_warning_trigger.connect(self._on_diff_versions)
self._status_change_trigger.connect(self._on_status_change)
self._new_remote_trigger.connect(self._on_new_remote)
self._stats_dialog._notification_trigger.connect(self._on_new_notification)
self._stats_dialog._shown_trigger.connect(self._on_stats_dialog_shown)
def _setup_icons(self):
@ -116,16 +123,24 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
)
self._stats_action.triggered.connect(self._show_stats_dialog)
self._menu.addAction("Close").triggered.connect(self._on_exit)
self._menu.addAction("Close").triggered.connect(self._on_close)
self._tray.show()
if not self._tray.isSystemTrayAvailable():
self._stats_dialog.show()
def _on_close(self):
self._exit = True
self._on_exit()
def _show_stats_dialog(self):
self._tray.setIcon(self.white_icon)
self._stats_dialog.show()
@QtCore.pyqtSlot(ui_pb2.Notification)
def _on_new_notification(self, notification):
self._nodes.send_notifications(notification)
@QtCore.pyqtSlot()
def _on_status_change(self):
self._stats_dialog.daemon_connected = self._connected
@ -146,9 +161,8 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self._msg.show()
self._version_warning_shown = True
@QtCore.pyqtSlot(str,ui_pb2.Statistics)
@QtCore.pyqtSlot(str, ui_pb2.Statistics)
def _on_new_remote(self, addr, stats):
print("_on_new_remote()")
dialog = StatsDialog(address = addr)
dialog.daemon_connected = True
dialog.update(stats)
@ -205,7 +219,7 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
return False
def _populate_stats(self, db, stats):
def _populate_stats(self, db, node, stats):
fields = []
values = []
@ -213,8 +227,8 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
if self.last_stats != None and event in self.last_stats.events:
continue
db.insert("connections",
"(time, action, protocol, src_ip, src_port, dst_ip, dst_host, dst_port, uid, process, process_args, rule)",
(event.time, event.rule.action, event.connection.protocol, event.connection.src_ip, str(event.connection.src_port),
"(time, node, action, protocol, src_ip, src_port, dst_ip, dst_host, dst_port, uid, process, process_args, rule)",
(str(datetime.now()), node, event.rule.action, event.connection.protocol, event.connection.src_ip, str(event.connection.src_port),
event.connection.dst_ip, event.connection.dst_host, str(event.connection.dst_port),
str(event.connection.user_id), event.connection.process_path, " ".join(event.connection.process_args),
event.rule.name),
@ -295,21 +309,29 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self.last_stats = stats
def Ping(self, request, context):
if self._is_local_request(context):
try:
self._last_ping = datetime.now()
self._populate_stats(self._db, request.stats)
self._stats_dialog.update(request.stats)
if request.stats.daemon_version != version:
self._version_warning_trigger.emit(request.stats.daemon_version, version)
else:
with self._remote_lock:
_, addr, _ = context.peer().split(':')
if addr in self._remote_stats:
self._populate_stats(self._db, request.stats)
self._remote_stats[addr].update(request.stats)
else:
self._new_remote_trigger.emit(addr, request.stats)
if self._is_local_request(context):
peer = context.peer().split(':')
self._populate_stats(self._db, peer[1], request.stats)
self._stats_dialog.update(request.stats)
else:
with self._remote_lock:
_, addr, _ = context.peer().split(':')
self._populate_stats(self._db, addr, request.stats)
# XXX: disable this option for now
#if addr in self._remote_stats:
# self._remote_stats[addr].update(request.stats)
#
#else:
# self._new_remote_trigger.emit(addr, request.stats)
except Exception as e:
print("Ping exception: ", e)
return ui_pb2.PingReply(id=request.id)
def AskRule(self, request, context):
@ -325,4 +347,37 @@ class UIService(ui_pb2_grpc.UIServicer, QtWidgets.QGraphicsObject):
self._last_ping = datetime.now()
self._asking = False
return rule
def Notifications(self, node_iter, context):
"""
Accept and collect nodes. It keeps a connection open with each
client, in order to send them notifications.
"""
try:
_node = self._nodes.add(context, node_iter.next())
stop_event = Event()
def _on_client_closed():
stop_event.set()
self._nodes.delete(context.peer())
context.add_callback(_on_client_closed)
except Exception as e:
print("[Notifications] exception adding new node", e)
while self._exit == False:
if stop_event.is_set():
break
try:
noti = _node['notifications'].get()
if noti != None:
_node['notifications'].task_done()
yield noti
except Exception as e:
print("[Notifications] exception getting notification from queue", e)
context.cancel()
return node

View file

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: ui.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
@ -19,9 +20,65 @@ DESCRIPTOR = _descriptor.FileDescriptor(
name='ui.proto',
package='protocol',
syntax='proto3',
serialized_pb=_b('\n\x08ui.proto\x12\x08protocol\"]\n\x05\x45vent\x12\x0c\n\x04time\x18\x01 \x01(\t\x12(\n\nconnection\x18\x02 \x01(\x0b\x32\x14.protocol.Connection\x12\x1c\n\x04rule\x18\x03 \x01(\x0b\x32\x0e.protocol.Rule\"\xd3\x06\n\nStatistics\x12\x16\n\x0e\x64\x61\x65mon_version\x18\x01 \x01(\t\x12\r\n\x05rules\x18\x02 \x01(\x04\x12\x0e\n\x06uptime\x18\x03 \x01(\x04\x12\x15\n\rdns_responses\x18\x04 \x01(\x04\x12\x13\n\x0b\x63onnections\x18\x05 \x01(\x04\x12\x0f\n\x07ignored\x18\x06 \x01(\x04\x12\x10\n\x08\x61\x63\x63\x65pted\x18\x07 \x01(\x04\x12\x0f\n\x07\x64ropped\x18\x08 \x01(\x04\x12\x11\n\trule_hits\x18\t \x01(\x04\x12\x13\n\x0brule_misses\x18\n \x01(\x04\x12\x33\n\x08\x62y_proto\x18\x0b \x03(\x0b\x32!.protocol.Statistics.ByProtoEntry\x12\x37\n\nby_address\x18\x0c \x03(\x0b\x32#.protocol.Statistics.ByAddressEntry\x12\x31\n\x07\x62y_host\x18\r \x03(\x0b\x32 .protocol.Statistics.ByHostEntry\x12\x31\n\x07\x62y_port\x18\x0e \x03(\x0b\x32 .protocol.Statistics.ByPortEntry\x12/\n\x06\x62y_uid\x18\x0f \x03(\x0b\x32\x1f.protocol.Statistics.ByUidEntry\x12=\n\rby_executable\x18\x10 \x03(\x0b\x32&.protocol.Statistics.ByExecutableEntry\x12\x1f\n\x06\x65vents\x18\x11 \x03(\x0b\x32\x0f.protocol.Event\x1a.\n\x0c\x42yProtoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x30\n\x0e\x42yAddressEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a-\n\x0b\x42yHostEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a-\n\x0b\x42yPortEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a,\n\nByUidEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x33\n\x11\x42yExecutableEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\">\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x04\x12#\n\x05stats\x18\x02 \x01(\x0b\x32\x14.protocol.Statistics\"\x17\n\tPingReply\x12\n\n\x02id\x18\x01 \x01(\x04\"\xc5\x01\n\nConnection\x12\x10\n\x08protocol\x18\x01 \x01(\t\x12\x0e\n\x06src_ip\x18\x02 \x01(\t\x12\x10\n\x08src_port\x18\x03 \x01(\r\x12\x0e\n\x06\x64st_ip\x18\x04 \x01(\t\x12\x10\n\x08\x64st_host\x18\x05 \x01(\t\x12\x10\n\x08\x64st_port\x18\x06 \x01(\r\x12\x0f\n\x07user_id\x18\x07 \x01(\r\x12\x12\n\nprocess_id\x18\x08 \x01(\r\x12\x14\n\x0cprocess_path\x18\t \x01(\t\x12\x14\n\x0cprocess_args\x18\n \x03(\t\"7\n\x08Operator\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0f\n\x07operand\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\t\"\\\n\x04Rule\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x10\n\x08\x64uration\x18\x03 \x01(\t\x12$\n\x08operator\x18\x04 \x01(\x0b\x32\x12.protocol.Operator2m\n\x02UI\x12\x34\n\x04Ping\x12\x15.protocol.PingRequest\x1a\x13.protocol.PingReply\"\x00\x12\x31\n\x07\x41skRule\x12\x14.protocol.Connection\x1a\x0e.protocol.Rule\"\x00\x62\x06proto3')
serialized_options=None,
serialized_pb=_b('\n\x08ui.proto\x12\x08protocol\"]\n\x05\x45vent\x12\x0c\n\x04time\x18\x01 \x01(\t\x12(\n\nconnection\x18\x02 \x01(\x0b\x32\x14.protocol.Connection\x12\x1c\n\x04rule\x18\x03 \x01(\x0b\x32\x0e.protocol.Rule\"\xd3\x06\n\nStatistics\x12\x16\n\x0e\x64\x61\x65mon_version\x18\x01 \x01(\t\x12\r\n\x05rules\x18\x02 \x01(\x04\x12\x0e\n\x06uptime\x18\x03 \x01(\x04\x12\x15\n\rdns_responses\x18\x04 \x01(\x04\x12\x13\n\x0b\x63onnections\x18\x05 \x01(\x04\x12\x0f\n\x07ignored\x18\x06 \x01(\x04\x12\x10\n\x08\x61\x63\x63\x65pted\x18\x07 \x01(\x04\x12\x0f\n\x07\x64ropped\x18\x08 \x01(\x04\x12\x11\n\trule_hits\x18\t \x01(\x04\x12\x13\n\x0brule_misses\x18\n \x01(\x04\x12\x33\n\x08\x62y_proto\x18\x0b \x03(\x0b\x32!.protocol.Statistics.ByProtoEntry\x12\x37\n\nby_address\x18\x0c \x03(\x0b\x32#.protocol.Statistics.ByAddressEntry\x12\x31\n\x07\x62y_host\x18\r \x03(\x0b\x32 .protocol.Statistics.ByHostEntry\x12\x31\n\x07\x62y_port\x18\x0e \x03(\x0b\x32 .protocol.Statistics.ByPortEntry\x12/\n\x06\x62y_uid\x18\x0f \x03(\x0b\x32\x1f.protocol.Statistics.ByUidEntry\x12=\n\rby_executable\x18\x10 \x03(\x0b\x32&.protocol.Statistics.ByExecutableEntry\x12\x1f\n\x06\x65vents\x18\x11 \x03(\x0b\x32\x0f.protocol.Event\x1a.\n\x0c\x42yProtoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x30\n\x0e\x42yAddressEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a-\n\x0b\x42yHostEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a-\n\x0b\x42yPortEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a,\n\nByUidEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\x1a\x33\n\x11\x42yExecutableEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x04:\x02\x38\x01\">\n\x0bPingRequest\x12\n\n\x02id\x18\x01 \x01(\x04\x12#\n\x05stats\x18\x02 \x01(\x0b\x32\x14.protocol.Statistics\"\x17\n\tPingReply\x12\n\n\x02id\x18\x01 \x01(\x04\"\xc5\x01\n\nConnection\x12\x10\n\x08protocol\x18\x01 \x01(\t\x12\x0e\n\x06src_ip\x18\x02 \x01(\t\x12\x10\n\x08src_port\x18\x03 \x01(\r\x12\x0e\n\x06\x64st_ip\x18\x04 \x01(\t\x12\x10\n\x08\x64st_host\x18\x05 \x01(\t\x12\x10\n\x08\x64st_port\x18\x06 \x01(\r\x12\x0f\n\x07user_id\x18\x07 \x01(\r\x12\x12\n\nprocess_id\x18\x08 \x01(\r\x12\x14\n\x0cprocess_path\x18\t \x01(\t\x12\x14\n\x0cprocess_args\x18\n \x03(\t\"7\n\x08Operator\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0f\n\x07operand\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\t\"\\\n\x04Rule\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\x12\x10\n\x08\x64uration\x18\x03 \x01(\t\x12$\n\x08operator\x18\x04 \x01(\x0b\x32\x12.protocol.Operator\"\x95\x01\n\x0c\x43lientConfig\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x19\n\x11isFirewallRunning\x18\x04 \x01(\x08\x12\x0e\n\x06\x63onfig\x18\x05 \x01(\t\x12\x10\n\x08logLevel\x18\x06 \x01(\r\x12\x1d\n\x05rules\x18\x07 \x03(\x0b\x32\x0e.protocol.Rule\"\x8f\x01\n\x0cNotification\x12\n\n\x02id\x18\x01 \x01(\x04\x12\x12\n\nclientName\x18\x02 \x01(\t\x12\x12\n\nserverName\x18\x03 \x01(\t\x12\x1e\n\x04type\x18\x04 \x01(\x0e\x32\x10.protocol.Action\x12\x0c\n\x04\x64\x61ta\x18\x05 \x01(\t\x12\x1d\n\x05rules\x18\x06 \x03(\x0b\x32\x0e.protocol.Rule*\x89\x01\n\x06\x41\x63tion\x12\x08\n\x04NONE\x10\x00\x12\x11\n\rLOAD_FIREWALL\x10\x01\x12\x13\n\x0fUNLOAD_FIREWALL\x10\x02\x12\x11\n\rCHANGE_CONFIG\x10\x03\x12\x0f\n\x0b\x45NABLE_RULE\x10\x04\x12\x10\n\x0c\x44ISABLE_RULE\x10\x05\x12\r\n\tLOG_LEVEL\x10\x06\x12\x08\n\x04STOP\x10\x07\x32\xb4\x01\n\x02UI\x12\x34\n\x04Ping\x12\x15.protocol.PingRequest\x1a\x13.protocol.PingReply\"\x00\x12\x31\n\x07\x41skRule\x12\x14.protocol.Connection\x1a\x0e.protocol.Rule\"\x00\x12\x45\n\rNotifications\x12\x16.protocol.ClientConfig\x1a\x16.protocol.Notification\"\x00(\x01\x30\x01\x62\x06proto3')
)
_ACTION = _descriptor.EnumDescriptor(
name='Action',
full_name='protocol.Action',
filename=None,
file=DESCRIPTOR,
values=[
_descriptor.EnumValueDescriptor(
name='NONE', index=0, number=0,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='LOAD_FIREWALL', index=1, number=1,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='UNLOAD_FIREWALL', index=2, number=2,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='CHANGE_CONFIG', index=3, number=3,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='ENABLE_RULE', index=4, number=4,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='DISABLE_RULE', index=5, number=5,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='LOG_LEVEL', index=6, number=6,
serialized_options=None,
type=None),
_descriptor.EnumValueDescriptor(
name='STOP', index=7, number=7,
serialized_options=None,
type=None),
],
containing_type=None,
serialized_options=None,
serialized_start=1710,
serialized_end=1847,
)
_sym_db.RegisterEnumDescriptor(_ACTION)
Action = enum_type_wrapper.EnumTypeWrapper(_ACTION)
NONE = 0
LOAD_FIREWALL = 1
UNLOAD_FIREWALL = 2
CHANGE_CONFIG = 3
ENABLE_RULE = 4
DISABLE_RULE = 5
LOG_LEVEL = 6
STOP = 7
@ -38,28 +95,28 @@ _EVENT = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='connection', full_name='protocol.Event.connection', index=1,
number=2, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rule', full_name='protocol.Event.rule', index=2,
number=3, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -83,21 +140,21 @@ _STATISTICS_BYPROTOENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByProtoEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -120,21 +177,21 @@ _STATISTICS_BYADDRESSENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByAddressEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -157,21 +214,21 @@ _STATISTICS_BYHOSTENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByHostEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -194,21 +251,21 @@ _STATISTICS_BYPORTENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByPortEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -231,21 +288,21 @@ _STATISTICS_BYUIDENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByUidEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -268,21 +325,21 @@ _STATISTICS_BYEXECUTABLEENTRY = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='value', full_name='protocol.Statistics.ByExecutableEntry.value', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
serialized_options=_b('8\001'),
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -305,126 +362,126 @@ _STATISTICS = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rules', full_name='protocol.Statistics.rules', index=1,
number=2, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='uptime', full_name='protocol.Statistics.uptime', index=2,
number=3, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='dns_responses', full_name='protocol.Statistics.dns_responses', index=3,
number=4, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='connections', full_name='protocol.Statistics.connections', index=4,
number=5, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='ignored', full_name='protocol.Statistics.ignored', index=5,
number=6, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='accepted', full_name='protocol.Statistics.accepted', index=6,
number=7, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='dropped', full_name='protocol.Statistics.dropped', index=7,
number=8, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rule_hits', full_name='protocol.Statistics.rule_hits', index=8,
number=9, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rule_misses', full_name='protocol.Statistics.rule_misses', index=9,
number=10, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_proto', full_name='protocol.Statistics.by_proto', index=10,
number=11, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_address', full_name='protocol.Statistics.by_address', index=11,
number=12, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_host', full_name='protocol.Statistics.by_host', index=12,
number=13, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_port', full_name='protocol.Statistics.by_port', index=13,
number=14, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_uid', full_name='protocol.Statistics.by_uid', index=14,
number=15, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='by_executable', full_name='protocol.Statistics.by_executable', index=15,
number=16, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='events', full_name='protocol.Statistics.events', index=16,
number=17, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[_STATISTICS_BYPROTOENTRY, _STATISTICS_BYADDRESSENTRY, _STATISTICS_BYHOSTENTRY, _STATISTICS_BYPORTENTRY, _STATISTICS_BYUIDENTRY, _STATISTICS_BYEXECUTABLEENTRY, ],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -448,21 +505,21 @@ _PINGREQUEST = _descriptor.Descriptor(
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='stats', full_name='protocol.PingRequest.stats', index=1,
number=2, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -486,14 +543,14 @@ _PINGREPLY = _descriptor.Descriptor(
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -517,77 +574,77 @@ _CONNECTION = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='src_ip', full_name='protocol.Connection.src_ip', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='src_port', full_name='protocol.Connection.src_port', index=2,
number=3, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='dst_ip', full_name='protocol.Connection.dst_ip', index=3,
number=4, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='dst_host', full_name='protocol.Connection.dst_host', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='dst_port', full_name='protocol.Connection.dst_port', index=5,
number=6, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='user_id', full_name='protocol.Connection.user_id', index=6,
number=7, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='process_id', full_name='protocol.Connection.process_id', index=7,
number=8, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='process_path', full_name='protocol.Connection.process_path', index=8,
number=9, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='process_args', full_name='protocol.Connection.process_args', index=9,
number=10, type=9, cpp_type=9, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -611,28 +668,28 @@ _OPERATOR = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='operand', full_name='protocol.Operator.operand', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='data', full_name='protocol.Operator.data', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -656,35 +713,35 @@ _RULE = _descriptor.Descriptor(
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='action', full_name='protocol.Rule.action', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='duration', full_name='protocol.Rule.duration', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='operator', full_name='protocol.Rule.operator', index=3,
number=4, type=11, cpp_type=10, label=1,
has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None, file=DESCRIPTOR),
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
@ -694,6 +751,145 @@ _RULE = _descriptor.Descriptor(
serialized_end=1409,
)
_CLIENTCONFIG = _descriptor.Descriptor(
name='ClientConfig',
full_name='protocol.ClientConfig',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='protocol.ClientConfig.id', index=0,
number=1, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='name', full_name='protocol.ClientConfig.name', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='version', full_name='protocol.ClientConfig.version', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='isFirewallRunning', full_name='protocol.ClientConfig.isFirewallRunning', index=3,
number=4, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='config', full_name='protocol.ClientConfig.config', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='logLevel', full_name='protocol.ClientConfig.logLevel', index=5,
number=6, type=13, cpp_type=3, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rules', full_name='protocol.ClientConfig.rules', index=6,
number=7, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=1412,
serialized_end=1561,
)
_NOTIFICATION = _descriptor.Descriptor(
name='Notification',
full_name='protocol.Notification',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='id', full_name='protocol.Notification.id', index=0,
number=1, type=4, cpp_type=4, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='clientName', full_name='protocol.Notification.clientName', index=1,
number=2, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='serverName', full_name='protocol.Notification.serverName', index=2,
number=3, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='type', full_name='protocol.Notification.type', index=3,
number=4, type=14, cpp_type=8, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='data', full_name='protocol.Notification.data', index=4,
number=5, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='rules', full_name='protocol.Notification.rules', index=5,
number=6, type=11, cpp_type=10, label=3,
has_default_value=False, default_value=[],
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
],
extensions=[
],
nested_types=[],
enum_types=[
],
serialized_options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=1564,
serialized_end=1707,
)
_EVENT.fields_by_name['connection'].message_type = _CONNECTION
_EVENT.fields_by_name['rule'].message_type = _RULE
_STATISTICS_BYPROTOENTRY.containing_type = _STATISTICS
@ -711,6 +907,9 @@ _STATISTICS.fields_by_name['by_executable'].message_type = _STATISTICS_BYEXECUTA
_STATISTICS.fields_by_name['events'].message_type = _EVENT
_PINGREQUEST.fields_by_name['stats'].message_type = _STATISTICS
_RULE.fields_by_name['operator'].message_type = _OPERATOR
_CLIENTCONFIG.fields_by_name['rules'].message_type = _RULE
_NOTIFICATION.fields_by_name['type'].enum_type = _ACTION
_NOTIFICATION.fields_by_name['rules'].message_type = _RULE
DESCRIPTOR.message_types_by_name['Event'] = _EVENT
DESCRIPTOR.message_types_by_name['Statistics'] = _STATISTICS
DESCRIPTOR.message_types_by_name['PingRequest'] = _PINGREQUEST
@ -718,62 +917,65 @@ DESCRIPTOR.message_types_by_name['PingReply'] = _PINGREPLY
DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
DESCRIPTOR.message_types_by_name['Operator'] = _OPERATOR
DESCRIPTOR.message_types_by_name['Rule'] = _RULE
DESCRIPTOR.message_types_by_name['ClientConfig'] = _CLIENTCONFIG
DESCRIPTOR.message_types_by_name['Notification'] = _NOTIFICATION
DESCRIPTOR.enum_types_by_name['Action'] = _ACTION
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), dict(
DESCRIPTOR = _EVENT,
__module__ = 'ui_pb2'
Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), {
'DESCRIPTOR' : _EVENT,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Event)
))
})
_sym_db.RegisterMessage(Event)
Statistics = _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), dict(
Statistics = _reflection.GeneratedProtocolMessageType('Statistics', (_message.Message,), {
ByProtoEntry = _reflection.GeneratedProtocolMessageType('ByProtoEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYPROTOENTRY,
__module__ = 'ui_pb2'
'ByProtoEntry' : _reflection.GeneratedProtocolMessageType('ByProtoEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYPROTOENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByProtoEntry)
))
})
,
ByAddressEntry = _reflection.GeneratedProtocolMessageType('ByAddressEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYADDRESSENTRY,
__module__ = 'ui_pb2'
'ByAddressEntry' : _reflection.GeneratedProtocolMessageType('ByAddressEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYADDRESSENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByAddressEntry)
))
})
,
ByHostEntry = _reflection.GeneratedProtocolMessageType('ByHostEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYHOSTENTRY,
__module__ = 'ui_pb2'
'ByHostEntry' : _reflection.GeneratedProtocolMessageType('ByHostEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYHOSTENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByHostEntry)
))
})
,
ByPortEntry = _reflection.GeneratedProtocolMessageType('ByPortEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYPORTENTRY,
__module__ = 'ui_pb2'
'ByPortEntry' : _reflection.GeneratedProtocolMessageType('ByPortEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYPORTENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByPortEntry)
))
})
,
ByUidEntry = _reflection.GeneratedProtocolMessageType('ByUidEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYUIDENTRY,
__module__ = 'ui_pb2'
'ByUidEntry' : _reflection.GeneratedProtocolMessageType('ByUidEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYUIDENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByUidEntry)
))
})
,
ByExecutableEntry = _reflection.GeneratedProtocolMessageType('ByExecutableEntry', (_message.Message,), dict(
DESCRIPTOR = _STATISTICS_BYEXECUTABLEENTRY,
__module__ = 'ui_pb2'
'ByExecutableEntry' : _reflection.GeneratedProtocolMessageType('ByExecutableEntry', (_message.Message,), {
'DESCRIPTOR' : _STATISTICS_BYEXECUTABLEENTRY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics.ByExecutableEntry)
))
})
,
DESCRIPTOR = _STATISTICS,
__module__ = 'ui_pb2'
'DESCRIPTOR' : _STATISTICS,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Statistics)
))
})
_sym_db.RegisterMessage(Statistics)
_sym_db.RegisterMessage(Statistics.ByProtoEntry)
_sym_db.RegisterMessage(Statistics.ByAddressEntry)
@ -782,63 +984,71 @@ _sym_db.RegisterMessage(Statistics.ByPortEntry)
_sym_db.RegisterMessage(Statistics.ByUidEntry)
_sym_db.RegisterMessage(Statistics.ByExecutableEntry)
PingRequest = _reflection.GeneratedProtocolMessageType('PingRequest', (_message.Message,), dict(
DESCRIPTOR = _PINGREQUEST,
__module__ = 'ui_pb2'
PingRequest = _reflection.GeneratedProtocolMessageType('PingRequest', (_message.Message,), {
'DESCRIPTOR' : _PINGREQUEST,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.PingRequest)
))
})
_sym_db.RegisterMessage(PingRequest)
PingReply = _reflection.GeneratedProtocolMessageType('PingReply', (_message.Message,), dict(
DESCRIPTOR = _PINGREPLY,
__module__ = 'ui_pb2'
PingReply = _reflection.GeneratedProtocolMessageType('PingReply', (_message.Message,), {
'DESCRIPTOR' : _PINGREPLY,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.PingReply)
))
})
_sym_db.RegisterMessage(PingReply)
Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict(
DESCRIPTOR = _CONNECTION,
__module__ = 'ui_pb2'
Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
'DESCRIPTOR' : _CONNECTION,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Connection)
))
})
_sym_db.RegisterMessage(Connection)
Operator = _reflection.GeneratedProtocolMessageType('Operator', (_message.Message,), dict(
DESCRIPTOR = _OPERATOR,
__module__ = 'ui_pb2'
Operator = _reflection.GeneratedProtocolMessageType('Operator', (_message.Message,), {
'DESCRIPTOR' : _OPERATOR,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Operator)
))
})
_sym_db.RegisterMessage(Operator)
Rule = _reflection.GeneratedProtocolMessageType('Rule', (_message.Message,), dict(
DESCRIPTOR = _RULE,
__module__ = 'ui_pb2'
Rule = _reflection.GeneratedProtocolMessageType('Rule', (_message.Message,), {
'DESCRIPTOR' : _RULE,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Rule)
))
})
_sym_db.RegisterMessage(Rule)
ClientConfig = _reflection.GeneratedProtocolMessageType('ClientConfig', (_message.Message,), {
'DESCRIPTOR' : _CLIENTCONFIG,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.ClientConfig)
})
_sym_db.RegisterMessage(ClientConfig)
_STATISTICS_BYPROTOENTRY.has_options = True
_STATISTICS_BYPROTOENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
_STATISTICS_BYADDRESSENTRY.has_options = True
_STATISTICS_BYADDRESSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
_STATISTICS_BYHOSTENTRY.has_options = True
_STATISTICS_BYHOSTENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
_STATISTICS_BYPORTENTRY.has_options = True
_STATISTICS_BYPORTENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
_STATISTICS_BYUIDENTRY.has_options = True
_STATISTICS_BYUIDENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
_STATISTICS_BYEXECUTABLEENTRY.has_options = True
_STATISTICS_BYEXECUTABLEENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
Notification = _reflection.GeneratedProtocolMessageType('Notification', (_message.Message,), {
'DESCRIPTOR' : _NOTIFICATION,
'__module__' : 'ui_pb2'
# @@protoc_insertion_point(class_scope:protocol.Notification)
})
_sym_db.RegisterMessage(Notification)
_STATISTICS_BYPROTOENTRY._options = None
_STATISTICS_BYADDRESSENTRY._options = None
_STATISTICS_BYHOSTENTRY._options = None
_STATISTICS_BYPORTENTRY._options = None
_STATISTICS_BYUIDENTRY._options = None
_STATISTICS_BYEXECUTABLEENTRY._options = None
_UI = _descriptor.ServiceDescriptor(
name='UI',
full_name='protocol.UI',
file=DESCRIPTOR,
index=0,
options=None,
serialized_start=1411,
serialized_end=1520,
serialized_options=None,
serialized_start=1850,
serialized_end=2030,
methods=[
_descriptor.MethodDescriptor(
name='Ping',
@ -847,7 +1057,7 @@ _UI = _descriptor.ServiceDescriptor(
containing_service=None,
input_type=_PINGREQUEST,
output_type=_PINGREPLY,
options=None,
serialized_options=None,
),
_descriptor.MethodDescriptor(
name='AskRule',
@ -856,7 +1066,16 @@ _UI = _descriptor.ServiceDescriptor(
containing_service=None,
input_type=_CONNECTION,
output_type=_RULE,
options=None,
serialized_options=None,
),
_descriptor.MethodDescriptor(
name='Notifications',
full_name='protocol.UI.Notifications',
index=2,
containing_service=None,
input_type=_CLIENTCONFIG,
output_type=_NOTIFICATION,
serialized_options=None,
),
])
_sym_db.RegisterServiceDescriptor(_UI)

View file

@ -24,6 +24,11 @@ class UIStub(object):
request_serializer=ui__pb2.Connection.SerializeToString,
response_deserializer=ui__pb2.Rule.FromString,
)
self.Notifications = channel.stream_stream(
'/protocol.UI/Notifications',
request_serializer=ui__pb2.ClientConfig.SerializeToString,
response_deserializer=ui__pb2.Notification.FromString,
)
class UIServicer(object):
@ -44,6 +49,13 @@ class UIServicer(object):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Notifications(self, request_iterator, context):
# missing associated documentation comment in .proto file
pass
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_UIServicer_to_server(servicer, server):
rpc_method_handlers = {
@ -57,6 +69,11 @@ def add_UIServicer_to_server(servicer, server):
request_deserializer=ui__pb2.Connection.FromString,
response_serializer=ui__pb2.Rule.SerializeToString,
),
'Notifications': grpc.stream_stream_rpc_method_handler(
servicer.Notifications,
request_deserializer=ui__pb2.ClientConfig.FromString,
response_serializer=ui__pb2.Notification.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'protocol.UI', rpc_method_handlers)