Log panel added

This commit is contained in:
pokamest 2022-02-04 17:49:48 +03:00
parent 1a7fa3746d
commit 6d1c9edc24
12 changed files with 186 additions and 12 deletions

View file

@ -79,6 +79,8 @@ ErrorCode ServerController::runScript(const ServerCredentials &credentials, QStr
} }
qDebug().noquote() << "EXEC" << lineToExec; qDebug().noquote() << "EXEC" << lineToExec;
Debug::appendSshLog("Run command:" + lineToExec);
QSharedPointer<SshRemoteProcess> proc = client->createRemoteProcess(lineToExec.toUtf8()); QSharedPointer<SshRemoteProcess> proc = client->createRemoteProcess(lineToExec.toUtf8());
if (!proc) { if (!proc) {
@ -101,7 +103,9 @@ ErrorCode ServerController::runScript(const ServerCredentials &credentials, QStr
QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardOutput, &wait, [proc, cbReadStdOut](){ QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardOutput, &wait, [proc, cbReadStdOut](){
QString s = proc->readAllStandardOutput(); QString s = proc->readAllStandardOutput();
if (s != "." && !s.isEmpty()) { if (s != "." && !s.isEmpty()) {
Debug::appendSshLog("Output: " + s);
qDebug().noquote() << "stdout" << s; qDebug().noquote() << "stdout" << s;
} }
if (cbReadStdOut) cbReadStdOut(s, proc); if (cbReadStdOut) cbReadStdOut(s, proc);
@ -110,6 +114,7 @@ ErrorCode ServerController::runScript(const ServerCredentials &credentials, QStr
QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardError, &wait, [proc, cbReadStdErr](){ QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardError, &wait, [proc, cbReadStdErr](){
QString s = proc->readAllStandardError(); QString s = proc->readAllStandardError();
if (s != "." && !s.isEmpty()) { if (s != "." && !s.isEmpty()) {
Debug::appendSshLog("Output: " + s);
qDebug().noquote() << "stderr" << s; qDebug().noquote() << "stderr" << s;
} }
if (cbReadStdErr) cbReadStdErr(s, proc); if (cbReadStdErr) cbReadStdErr(s, proc);
@ -135,6 +140,7 @@ ErrorCode ServerController::runContainerScript(const ServerCredentials &credenti
const std::function<void (const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdErr) const std::function<void (const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdErr)
{ {
QString fileName = "/opt/amnezia/" + Utils::getRandomString(16) + ".sh"; QString fileName = "/opt/amnezia/" + Utils::getRandomString(16) + ".sh";
Debug::appendSshLog("Run container script for " + ContainerProps::containerToString(container) + ":\n" + script);
ErrorCode e = uploadTextFileToContainer(container, credentials, script, fileName); ErrorCode e = uploadTextFileToContainer(container, credentials, script, fileName);
if (e) return e; if (e) return e;

View file

@ -5,6 +5,7 @@
#include <QObject> #include <QObject>
#include "sshconnection.h" #include "sshconnection.h"
#include "sshremoteprocess.h" #include "sshremoteprocess.h"
#include "debug.h"
#include "defs.h" #include "defs.h"
#include "settings.h" #include "settings.h"

View file

@ -28,10 +28,30 @@ void debugMessageHandler(QtMsgType type, const QMessageLogContext& context, cons
} }
Debug::m_textStream << qFormatLogMessage(type, context, msg) << endl << flush; Debug::m_textStream << qFormatLogMessage(type, context, msg) << endl << flush;
Debug::appendAllLog(qFormatLogMessage(type, context, msg));
std::cout << qFormatLogMessage(type, context, msg).toStdString() << std::endl << std::flush; std::cout << qFormatLogMessage(type, context, msg).toStdString() << std::endl << std::flush;
} }
Debug &Debug::Instance()
{
static Debug s;
return s;
}
void Debug::appendSshLog(const QString &log)
{
QString dt = QDateTime::currentDateTime().toString();
Instance().m_sshLog.append(dt + ": " + log + "\n");
emit Instance().sshLogChanged(Instance().sshLog());
}
void Debug::appendAllLog(const QString &log)
{
Instance().m_allLog.append(log + "\n");
emit Instance().allLogChanged(Instance().allLog());
}
bool Debug::init() bool Debug::init()
{ {
qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss} %{type} %{message}"); qSetMessagePattern("%{time yyyy-MM-dd hh:mm:ss} %{type} %{message}");
@ -67,7 +87,7 @@ QString Debug::userLogsFilePath()
return userLogsDir() + QDir::separator() + m_logFileName; return userLogsDir() + QDir::separator() + m_logFileName;
} }
QString Debug::getLogs() QString Debug::getLogFile()
{ {
m_file.flush(); m_file.flush();
QFile file(userLogsFilePath()); QFile file(userLogsFilePath());

View file

@ -7,9 +7,21 @@
#include <QString> #include <QString>
#include <QTextStream> #include <QTextStream>
class Debug #include "ui/property_helper.h"
class Debug : public QObject
{ {
Q_OBJECT
AUTO_PROPERTY(QString, sshLog)
AUTO_PROPERTY(QString, allLog)
public: public:
static Debug& Instance();
static void appendSshLog(const QString &log);
static void appendAllLog(const QString &log);
static bool init(); static bool init();
static bool openLogsFolder(); static bool openLogsFolder();
static bool openServiceLogsFolder(); static bool openServiceLogsFolder();
@ -19,9 +31,13 @@ public:
static void cleanUp(); static void cleanUp();
static QString userLogsFilePath(); static QString userLogsFilePath();
static QString getLogs(); static QString getLogFile();
private: private:
Debug() {}
Debug(Debug const &) = delete;
Debug& operator= (Debug const&) = delete;
static QString userLogsDir(); static QString userLogsDir();
static QFile m_file; static QFile m_file;

View file

@ -181,6 +181,8 @@ int main(int argc, char *argv[])
QCoreApplication::exit(-1); QCoreApplication::exit(-1);
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
engine->rootContext()->setContextProperty("Debug", &Debug::Instance());
engine->rootContext()->setContextProperty("UiLogic", uiLogic); engine->rootContext()->setContextProperty("UiLogic", uiLogic);
engine->rootContext()->setContextProperty("AppSettingsLogic", uiLogic->appSettingsLogic()); engine->rootContext()->setContextProperty("AppSettingsLogic", uiLogic->appSettingsLogic());

View file

@ -65,7 +65,7 @@ void AppSettingsLogic::onPushButtonOpenLogsClicked()
void AppSettingsLogic::onPushButtonExportLogsClicked() void AppSettingsLogic::onPushButtonExportLogsClicked()
{ {
QString log = Debug::getLogs(); QString log = Debug::getLogFile();
QString ext = ".log"; QString ext = ".log";
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save log"), QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save log"),

View file

@ -3,11 +3,13 @@ import QtQuick.Controls 2.12
CheckBox { CheckBox {
id: root id: root
property int imageWidth : 20
property int imageHeight : 20
indicator: Image { indicator: Image {
// y: 5 id: indicator
anchors.verticalCenter: root.verticalCenter anchors.verticalCenter: root.verticalCenter
height: 20 height: imageHeight
width: 20 width: imageWidth
source: root.checked ? "qrc:/images/controls/check_on.png" source: root.checked ? "qrc:/images/controls/check_on.png"
: "qrc:/images/controls/check_off.png" : "qrc:/images/controls/check_off.png"
} }

View file

@ -59,6 +59,10 @@ PageBase {
SelectContainer { SelectContainer {
id: container_selector id: container_selector
onAboutToHide: {
pageLoader.focus = true
}
onContainerSelected: { onContainerSelected: {
var containerProto = ContainerProps.defaultProtocol(c_index) var containerProto = ContainerProps.defaultProtocol(c_index)

View file

@ -41,6 +41,10 @@ PageBase {
SelectContainer { SelectContainer {
id: container_selector id: container_selector
onAboutToHide: {
pageLoader.focus = true
}
onContainerSelected: { onContainerSelected: {
var containerProto = ContainerProps.defaultProtocol(c_index) var containerProto = ContainerProps.defaultProtocol(c_index)

View file

@ -1,6 +1,7 @@
import QtQuick 2.14 import QtQuick 2.14
import QtQuick.Window 2.14 import QtQuick.Window 2.14
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
import QtQuick.Layouts 1.15
import QtQuick.Controls.Material 2.12 import QtQuick.Controls.Material 2.12
import PageEnum 1.0 import PageEnum 1.0
import PageType 1.0 import PageType 1.0
@ -8,6 +9,7 @@ import Qt.labs.platform 1.1
import Qt.labs.folderlistmodel 2.12 import Qt.labs.folderlistmodel 2.12
import QtQuick.Dialogs 1.1 import QtQuick.Dialogs 1.1
import "./" import "./"
import "Controls"
import "Pages" import "Pages"
import "Pages/Protocols" import "Pages/Protocols"
import "Pages/Share" import "Pages/Share"
@ -38,7 +40,7 @@ Window {
else if (type === PageType.ShareProto) p_obj = sharePages[page] else if (type === PageType.ShareProto) p_obj = sharePages[page]
else return else return
console.debug("QML gotoPage " + type + " " + page + " " + p_obj) //console.debug("QML gotoPage " + type + " " + page + " " + p_obj)
if (pageLoader.depth > 0) { if (pageLoader.depth > 0) {
pageLoader.currentItem.deactivated() pageLoader.currentItem.deactivated()
@ -118,7 +120,7 @@ Window {
focus: true focus: true
onCurrentItemChanged: { onCurrentItemChanged: {
console.debug("QML onCurrentItemChanged " + pageLoader.currentItem) //console.debug("QML onCurrentItemChanged " + pageLoader.currentItem)
UiLogic.currentPageValue = currentItem.page UiLogic.currentPageValue = currentItem.page
} }
@ -213,15 +215,15 @@ Window {
Connections { Connections {
target: UiLogic target: UiLogic
function onGoToPage(page, reset, slide) { function onGoToPage(page, reset, slide) {
console.debug("Qml Connections onGoToPage " + page); //console.debug("Qml Connections onGoToPage " + page);
root.gotoPage(PageType.Basic, page, reset, slide) root.gotoPage(PageType.Basic, page, reset, slide)
} }
function onGoToProtocolPage(protocol, reset, slide) { function onGoToProtocolPage(protocol, reset, slide) {
console.debug("Qml Connections onGoToProtocolPage " + protocol); //console.debug("Qml Connections onGoToProtocolPage " + protocol);
root.gotoPage(PageType.Proto, protocol, reset, slide) root.gotoPage(PageType.Proto, protocol, reset, slide)
} }
function onGoToShareProtocolPage(protocol, reset, slide) { function onGoToShareProtocolPage(protocol, reset, slide) {
console.debug("Qml Connections onGoToShareProtocolPage " + protocol); //console.debug("Qml Connections onGoToShareProtocolPage " + protocol);
root.gotoPage(PageType.ShareProto, protocol, reset, slide) root.gotoPage(PageType.ShareProto, protocol, reset, slide)
} }
@ -249,6 +251,9 @@ Window {
root.raise() root.raise()
root.requestActivate() root.requestActivate()
} }
function onToggleLogPanel() {
drawer_log.visible = !drawer_log.visible
}
} }
MessageDialog { MessageDialog {
@ -275,4 +280,114 @@ Window {
text: UiLogic.dialogConnectErrorText text: UiLogic.dialogConnectErrorText
visible: false visible: false
} }
Drawer {
id: drawer_log
z: -3
y: 0
x: 0
edge: Qt.BottomEdge
width: parent.width
height: parent.height * 0.85
modal: true
//interactive: activeFocus
onAboutToHide: {
pageLoader.focus = true
}
onAboutToShow: {
tfSshLog.focus = true
}
Item {
id: itemLog
anchors.fill: parent
Keys.onPressed: {
UiLogic.keyPressEvent(event.key)
event.accepted = true
}
RadioButtonType {
id: rbSshLog
focus: false
anchors.left: parent.left
anchors.leftMargin: 10
anchors.bottom: parent.bottom
anchors.bottomMargin: 2
height: 25
text: qsTr("Ssh log")
}
RadioButtonType {
id: rbAllLog
focus: false
checked: true
anchors.left: rbSshLog.right
anchors.bottom: rbSshLog.bottom
anchors.top: rbSshLog.top
height: rbSshLog.height
text: qsTr("App log")
}
CheckBoxType {
id: cbLogWrap
text: qsTr("Wrap words")
checked: true
anchors.right: parent.right
anchors.bottom: rbAllLog.bottom
anchors.top: rbAllLog.top
height: 15
imageHeight: 15
imageWidth: 15
onCheckedChanged: {
tfSshLog
}
}
TextAreaType {
id: tfSshLog
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: rbSshLog.top
flickableDirection: Flickable.AutoFlickIfNeeded
textArea.readOnly: true
textArea.selectByMouse: true
textArea.verticalAlignment: Text.AlignTop
textArea.text: {
if (!drawer_log.visible) return ""
else if (rbSshLog.checked ) return Debug.sshLog
else return Debug.allLog
}
textArea.wrapMode: cbLogWrap.checked ? TextEdit.WordWrap: TextEdit.NoWrap
Keys.onPressed: {
UiLogic.keyPressEvent(event.key)
event.accepted = true
}
textArea.onTextChanged: {
textArea.cursorPosition = textArea.length-1
}
MouseArea {
anchors.fill: parent
enabled: GC.isDesktop()
acceptedButtons: Qt.RightButton
onClicked: contextMenu.open()
}
ContextMenu {
id: contextMenu
textObj: tfSshLog.textArea
}
}
}
}
} }

View file

@ -214,6 +214,9 @@ void UiLogic::onUpdateAllPages()
void UiLogic::keyPressEvent(Qt::Key key) void UiLogic::keyPressEvent(Qt::Key key)
{ {
switch (key) { switch (key) {
case Qt::Key_AsciiTilde:
case Qt::Key_QuoteLeft: emit toggleLogPanel();
break;
case Qt::Key_L: Debug::openLogsFolder(); case Qt::Key_L: Debug::openLogsFolder();
break; break;
case Qt::Key_K: Debug::openServiceLogsFolder(); case Qt::Key_K: Debug::openServiceLogsFolder();

View file

@ -121,6 +121,7 @@ signals:
void show(); void show();
void hide(); void hide();
void raise(); void raise();
void toggleLogPanel();
private: private:
QString m_dialogConnectErrorText; QString m_dialogConnectErrorText;