From 98d31dde1d8c220bd3602d4751c24508a54e3fab Mon Sep 17 00:00:00 2001 From: Fabian Schillinger Date: Fri, 5 Nov 2010 02:03:45 +0100 Subject: Process start/stop/view functionality Cleanup write to logfiles if start/stop/view of processes failed added some prompts stop more then one process at the same time --- src/gui/mainWindow.cpp | 75 ++++++++++++++++++-------------------- src/gui/mainWindow.h | 11 +++--- src/gui/processWidget.cpp | 56 +++++++++++++++++++++++++--- src/gui/processWidget.h | 3 +- src/gui/processesDialog.cpp | 26 +++++++------ src/gui/processesDialog.h | 2 +- src/gui/processesStartDialog.cpp | 53 +++++++++++++++++---------- src/gui/processesStartDialog.h | 18 +++++---- src/gui/ui/processWidget.ui | 2 +- src/gui/ui/processesStartDialog.ui | 32 +++++++++++----- 10 files changed, 178 insertions(+), 100 deletions(-) (limited to 'src/gui') diff --git a/src/gui/mainWindow.cpp b/src/gui/mainWindow.cpp index b6878e8..e044470 100644 --- a/src/gui/mainWindow.cpp +++ b/src/gui/mainWindow.cpp @@ -68,6 +68,8 @@ MainWindow::MainWindow(QWidget *parent) : _aboutDialog = new AboutDialog(this); + displayedClientNameEnum = 0; + PVSConnectionManager::getManager(); //set the maximum width for list content @@ -112,8 +114,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionProjection, SIGNAL(triggered()), this, SLOT(projecttoolbar())); connect(ui->actionUnprojection, SIGNAL(triggered()), this, SLOT(unprojecttoolbar())); connect(ui->actionDozent, SIGNAL(triggered()), this, SLOT(setdozenttoolbar())); - connect(ui->actionShowProcesses, SIGNAL(triggered()), this, SLOT(showProcesses())); - connect(ui->actionStartProcess, SIGNAL(triggered()), this, SLOT(startProcess())); // Ui specific settings @@ -770,57 +770,44 @@ void MainWindow::closeUp() } } -/* Perform some action if actionShowProcesses button was pressed - * - */ +// Perform some action if actionShowProcesses button was pressed void MainWindow::showProcesses() { - std::list* selectedClients = - MainWindow::getConnectionList()->getSelectedClients(); - if (selectedClients->size() >= 1) - { - ProcessDialog procDialog; - procDialog.exec(); - - } - else - { - QString - message = - QString( - tr( - "This operation can only be performed if you have selected at least one Client!")); - QMessageBox::information(this, "PVS", message); - } - + ProcessDialog procShowDialog(0,displayedClientNameEnum); + procShowDialog.exec(); } -/* Perform some action if actionStartProcess button was pressed - * - */ +// Perform some action if actionStartProcess button was pressed void MainWindow::startProcess() { std::list* selectedClients = MainWindow::getConnectionList()->getSelectedClients(); if (selectedClients->size() >= 1) { - // do stuff - /*PVSClient * pvsClient = - PVSConnectionManager::getManager()->getClientFromIp( - selectedClients->front().toStdString().c_str());*/ - - ProcessesStartDialog procD; - QString myString = NULL; - int result = procD.exec(); - - if (result == 1) + ProcessesStartDialog procStartDialog; + procToStart = ""; + int result = procStartDialog.exec(); + if (result == 1) //if result == 1 we clicked send on our button then + //procToStart is set to the text that was given in our messageEdit { - myString = MainWindow::getWindow()->getProcessesDialog(); - if(!myString.isEmpty()) - MainWindow::getConnectionWindow()->commandStations("STARTPROCESS",myString); + std::list::iterator itSelected; + for (itSelected = selectedClients->begin(); itSelected != selectedClients->end(); + itSelected++) + { + std::list listAll = + PVSConnectionManager::getManager()->getConnections(); + for (std::list::iterator itAll = listAll.begin(); + itAll != listAll.end(); itAll++) + { + if ((*itSelected) == (*itAll)->getIp()) + { + (*itAll)->sendMessage(PVSCOMMAND, "STARTPROCESS", procToStart); + break; + } + } + } } - } else { @@ -880,6 +867,7 @@ void MainWindow::createProfile() void MainWindow::showusername() { + displayedClientNameEnum = 2; MainWindow::getConnectionList()->setColumnHidden(2, false); MainWindow::getConnectionList()->setColumnHidden(0, true); MainWindow::getConnectionList()->setColumnHidden(1, true); @@ -887,6 +875,7 @@ void MainWindow::showusername() void MainWindow::showname() { + displayedClientNameEnum = 0; MainWindow::getConnectionList()->setColumnHidden(0, false); MainWindow::getConnectionList()->setColumnHidden(1, true); MainWindow::getConnectionList()->setColumnHidden(2, true); @@ -894,6 +883,7 @@ void MainWindow::showname() void MainWindow::showip() { + displayedClientNameEnum = 1; MainWindow::getConnectionList()->setColumnHidden(1, false); MainWindow::getConnectionList()->setColumnHidden(2, true); MainWindow::getConnectionList()->setColumnHidden(0, true); @@ -1293,6 +1283,11 @@ void MainWindow::configureNetwork() } } +int MainWindow::getDisplayedClientNameEnum() +{ + return displayedClientNameEnum; +} + MainWindow* MainWindow::myself = NULL; ConnectionList* MainWindow::conList = NULL; ConnectionWindow* MainWindow::conWin = NULL; diff --git a/src/gui/mainWindow.h b/src/gui/mainWindow.h index 28f82f7..671bf38 100644 --- a/src/gui/mainWindow.h +++ b/src/gui/mainWindow.h @@ -96,8 +96,8 @@ public: void setMsgDialog(QString msgd){msgDialog = msgd;}; QString getMsgDialog(){return msgDialog;}; - void setProcessesDialog(QString procd){procDialog = procd;}; - QString getProcessesDialog(){return procDialog;}; + void setProcessesDialog(QString procd){procToStart = procd;}; + QString getProcessesDialog(){return procToStart;}; bool isLockAllStatus() { @@ -106,8 +106,6 @@ public: void appendLogMsg(); - - protected: void closeEvent(QCloseEvent *e); void changeEvent(QEvent *e); @@ -128,6 +126,8 @@ private: QString _sessionName; QString _profilName; + int displayedClientNameEnum; //to tell if username, loginname or ip is shown in clientList + QStringList _chatListClients; @@ -139,7 +139,7 @@ private: AboutDialog *_aboutDialog; QString msgDialog; - QString procDialog; + QString procToStart; bool bgimage; bool locked, locked1; bool force_square; @@ -186,6 +186,7 @@ public slots: void startChatDialog(); void showProcesses(); void startProcess(); + int getDisplayedClientNameEnum(); private slots: void onToggleLog(bool showtime); diff --git a/src/gui/processWidget.cpp b/src/gui/processWidget.cpp index 9b59b2a..d61b42c 100644 --- a/src/gui/processWidget.cpp +++ b/src/gui/processWidget.cpp @@ -28,10 +28,11 @@ ProcessWidget::ProcessWidget(QWidget *parent, PVSClient *cl): client = cl; connect( prowui->startButton, SIGNAL( clicked()), this, SLOT( startProcess())); - connect( prowui->refreshButton, SIGNAL( clicked()), this, SLOT( refrProcessList())); + connect( prowui->refreshButton, SIGNAL( clicked()), this, SLOT( resendProcessList())); connect( prowui->stopButton, SIGNAL( clicked()), this, SLOT( stopProcess())); connect( client, SIGNAL( processVectorReady(bool)), this, SLOT( refrProcessList())); + //tell client we want to see his processes sendCommand("SHOWPROCESSES", ""); } @@ -39,7 +40,7 @@ void ProcessWidget::startProcess() { QMessageBox::StandardButton start = QMessageBox::question(0, tr("PVS Start Process"), tr("Do you want to start the process: ") + prowui->processLineEdit->text() + - tr(" on User '") + client->getDesktopName() + tr("' ?"), + tr(" on this Client?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); if (start == QMessageBox::Ok) @@ -50,15 +51,23 @@ void ProcessWidget::startProcess() prowui->processLineEdit->clear(); } +void ProcessWidget::resendProcessList() +{ + sendCommand("SHOWPROCESSES", ""); +} + + void ProcessWidget::refrProcessList() { + //remove every item of our list for(int i=prowui->processTable->rowCount(); i == 0; i--) { prowui->processTable->removeRow(i); } prowui->processTable->setRowCount(0); - QVector processes = client->getProcessesVector(); + //read every entry of the vector - split it - and put it to the list + QVector processes = client->getProcessesVector(); for (int i=0; iprocessTable->setRowCount(i+1); @@ -68,6 +77,7 @@ void ProcessWidget::refrProcessList() prowui->processTable->setItem(i,j,new QTableWidgetItem(processesList.at(j),0)); } } + //select row 0 prowui->processTable->selectRow(0); } @@ -75,15 +85,51 @@ void ProcessWidget::stopProcess() { if (prowui->processTable->rowCount() > 0) { + //get a list of all selected items + QList selectedItems = prowui->processTable->selectedItems(); + QList rows; + for (int i=0;irow()) < 0) + rows.append(selectedItems.at(i)->row()); + } + //append names of processes + QString processesMessage = ""; + for (int i=0;iprocessTable->item(rows.at(i),1)->text()); + processesMessage.append(QString(tr(" "))); + } + + QMessageBox::StandardButton start = QMessageBox::question(0, + tr("PVS Start Process"), tr("Do you want to stop the process(es):") + processesMessage + + tr("on this Client?"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); + if (start == QMessageBox::Ok) + { + //send KILLPROCESS for every row + for (int i=0;iprocessTable->item(rows.at(i),0)->text()); + } + } + //tell client to update his list + sendCommand("SHOWPROCESSES", ""); + /* QMessageBox::StandardButton start = QMessageBox::question(0, tr("PVS Start Process"), tr("Do you want to stop the process: ") + prowui->processTable->item(prowui->processTable->currentRow(),1)->text() + - tr(" on User '") + client->getDesktopName() + tr("' ?"), + tr(" on this Client?"), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); if (start == QMessageBox::Ok) { sendCommand("KILLPROCESS", prowui->processTable->item(prowui->processTable->currentRow(),0)->text()); sendCommand("SHOWPROCESSES", ""); - } + }*/ } } diff --git a/src/gui/processWidget.h b/src/gui/processWidget.h index 7e7eb72..788c9e6 100644 --- a/src/gui/processWidget.h +++ b/src/gui/processWidget.h @@ -17,7 +17,7 @@ class ProcessWidget: public QWidget public: ProcessWidget(QWidget *parent, PVSClient *client); ~ ProcessWidget(); - QAbstractItemModel *model; + public slots: void refrProcessList(); @@ -29,6 +29,7 @@ private: private slots: void startProcess(); void stopProcess(); + void resendProcessList(); void sendCommand(QString ident, QString message); }; diff --git a/src/gui/processesDialog.cpp b/src/gui/processesDialog.cpp index cda76ea..49535d5 100644 --- a/src/gui/processesDialog.cpp +++ b/src/gui/processesDialog.cpp @@ -1,5 +1,5 @@ /* -# Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg +# Copyright (c) 2010 - OpenSLX Project, Computer Center University of Freiburg # # This program is free software distributed under the GPL version 2. # See http://openslx.org/COPYING @@ -17,9 +17,8 @@ #include "processesDialog.h" #include "ui_processesDialog.h" #include -//#include -ProcessDialog::ProcessDialog(QDialog *parent) : +ProcessDialog::ProcessDialog(QDialog *parent, int displayedClientNameEnum) : QDialog(parent), procui(new Ui::ProcessesDialog) { @@ -28,6 +27,7 @@ ProcessDialog::ProcessDialog(QDialog *parent) : tWidget = new QTabWidget; procui->grLayout->addWidget(tWidget); + //if we click on another tab we refresh the list of this client connect( tWidget, SIGNAL( currentChanged(int)), this, SLOT( currChanged())); std::list listAll = @@ -35,15 +35,19 @@ ProcessDialog::ProcessDialog(QDialog *parent) : for (std::list::iterator it = listAll.begin(); it != listAll.end(); it++) { - if (*it == NULL || (*it)->getConnectionFrame() == NULL) continue; - if ((*it)->getConnectionFrame()->getFrame() && - /*!(*it)->getConnectionFrame()->getFrame()->isDozent() &&*/ - (*it)->getVNCConnection()) + //display ip/login name/user name the same way we do in our clientlist + switch (displayedClientNameEnum) + { + case 1: + tWidget->addTab(new ProcessWidget(0, *it), (*it)->getIp()); + break; + case 2: + tWidget->addTab(new ProcessWidget(0, *it), (*it)->getLoginName()); + break; + default: tWidget->addTab(new ProcessWidget(0, *it), (*it)->getUserName()); - else if (!(*it)->getConnectionFrame()->getFrame()) - ConsoleLog writeError(QString("The Frame connection from client: "). - append((*it)->getConnectionFrame()->getTaskbarTitle()). - append(QString(" is corrupted. Reconnect the client it again."))); + break; + } } } diff --git a/src/gui/processesDialog.h b/src/gui/processesDialog.h index 9d98136..d2bcae1 100644 --- a/src/gui/processesDialog.h +++ b/src/gui/processesDialog.h @@ -21,7 +21,7 @@ class MainWindow; class ProcessDialog : public QDialog { Q_OBJECT public: - ProcessDialog(QDialog *parent = 0); + ProcessDialog(QDialog *parent = 0, int displayedClientNameEnum = 0); ~ProcessDialog(); diff --git a/src/gui/processesStartDialog.cpp b/src/gui/processesStartDialog.cpp index b4c8c79..f176f7e 100644 --- a/src/gui/processesStartDialog.cpp +++ b/src/gui/processesStartDialog.cpp @@ -19,9 +19,11 @@ #include ProcessesStartDialog::ProcessesStartDialog(QWidget *parent) : - QDialog(parent) + QDialog(parent), + procStartUi(new Ui::ProcessesStartDialog) { - textLabel = new QLabel; + procStartUi->setupUi(this); + /*textLabel = new QLabel; textLabel->setText("Process to start:"); messageEdit = new QLineEdit; @@ -36,11 +38,16 @@ ProcessesStartDialog::ProcessesStartDialog(QWidget *parent) : layout->addWidget(textLabel,0,0); layout->addWidget(messageEdit,1,0); - layout->addWidget(cancelButton,2,0); + layout->addWidget(cancelButton,2,1); layout->addWidget(sendButton,2,0); setLayout(layout); - setWindowTitle(tr("PVS start Process")); + setWindowTitle(tr("PVS start Process"));*/ + + connect( procStartUi->sendButton, SIGNAL( clicked()), this, SLOT( send())); + connect( procStartUi->cancelButton, SIGNAL( clicked()), this, SLOT( notSend())); + procStartUi->listOfProcessesButton->hide(); + //connect( procStartUi->listOfProcessesButton, SIGNAL( clicked()), this, SLOT( listProcesses())); } ProcessesStartDialog::~ProcessesStartDialog() @@ -50,26 +57,32 @@ ProcessesStartDialog::~ProcessesStartDialog() void ProcessesStartDialog::send() { - QString procd = messageEdit->text(); - MainWindow::getWindow()->setProcessesDialog(procd); - messageEdit->clear(); - emit accept(); + QString procd = procStartUi->message->text(); + + if (procd.length()>0) + { + QMessageBox::StandardButton start = QMessageBox::question(0, + tr("PVS Start Process"), tr("Do you want to start the process: ") + procd + + tr(" on the selected Clients?"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); + + if (start == QMessageBox::Ok) + { + //write name of process to setProcessesDialog + MainWindow::getWindow()->setProcessesDialog(procd); + } + procStartUi->message->clear(); + emit accept(); + } } -void ProcessesStartDialog::NotSend() +void ProcessesStartDialog::notSend() { - messageEdit->clear(); + procStartUi->message->clear(); emit reject(); } -/*void ProcessesStartDialog::changeEvent(QEvent *e) +void ProcessesStartDialog::listProcesses() { - //QDialog::changeEvent(e); - //switch (e->type()) { - //case QEvent::LanguageChange: - // procstartui->retranslateUi(this); - // break; - //default: - // break; - //} -}*/ + // +} diff --git a/src/gui/processesStartDialog.h b/src/gui/processesStartDialog.h index 61aee4f..856279b 100644 --- a/src/gui/processesStartDialog.h +++ b/src/gui/processesStartDialog.h @@ -3,29 +3,33 @@ #include #include +#include "ui_processesStartDialog.h" +namespace Ui { + class ProcessesStartDialog; +} class MainWindow; - +class QDialog; class ProcessesStartDialog : public QDialog { Q_OBJECT public: ProcessesStartDialog(QWidget *parent = 0); ~ProcessesStartDialog(); -/*protected: - void changeEvent(QEvent *e);*/ - private: - QGridLayout *layout; + Ui::ProcessesStartDialog *procStartUi; + + /*QGridLayout *layout; QLabel *textLabel; QLineEdit *messageEdit; QPushButton *sendButton; - QPushButton *cancelButton; + QPushButton *cancelButton;*/ private slots: void send(); - void NotSend(); + void notSend(); + void listProcesses(); }; #endif // PROCESSESSTARTDIALOG_H diff --git a/src/gui/ui/processWidget.ui b/src/gui/ui/processWidget.ui index 3e7f55e..5ada967 100644 --- a/src/gui/ui/processWidget.ui +++ b/src/gui/ui/processWidget.ui @@ -56,7 +56,7 @@ true - QAbstractItemView::SingleSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows diff --git a/src/gui/ui/processesStartDialog.ui b/src/gui/ui/processesStartDialog.ui index 5d8c7ee..0f6c60a 100644 --- a/src/gui/ui/processesStartDialog.ui +++ b/src/gui/ui/processesStartDialog.ui @@ -6,8 +6,8 @@ 0 0 - 393 - 109 + 418 + 120 @@ -16,13 +16,20 @@ - 20 - 20 - 351 - 71 + 10 + 10 + 401 + 101 + + + + Process to start: + + + @@ -31,6 +38,13 @@ 5 + + + + List of Processes + + + @@ -45,16 +59,16 @@ - + Cancel - + - Send + Start -- cgit v1.2.3-55-g7522 From ded15ea687403e165914b746e948bce2cc78bc57 Mon Sep 17 00:00:00 2001 From: Fabian Schillinger Date: Fri, 5 Nov 2010 11:14:22 +0100 Subject: Process start/stop/view functionality Cleanup --- misc/pvs.conf | 2 ++ src/gui/processWidget.cpp | 16 ++++++++++++---- src/gui/processWidget.h | 2 +- src/gui/processesDialog.cpp | 13 ++++++++++++- src/gui/processesDialog.h | 2 ++ src/gui/ui/mainwindow.ui | 5 ++++- src/gui/ui/mainwindowtouch.ui | 9 ++++++--- src/gui/ui/processWidget.ui | 10 +++++----- src/pvs.cpp | 8 +++++++- 9 files changed, 51 insertions(+), 16 deletions(-) (limited to 'src/gui') diff --git a/misc/pvs.conf b/misc/pvs.conf index 93c4ac5..8e1f67c 100644 --- a/misc/pvs.conf +++ b/misc/pvs.conf @@ -7,3 +7,5 @@ vnc_other=no allow_chat=T allow_filetransfer=T +[RemoteProcess] +filter=pvs pvsgui pvsmgr x11vnc dbus diff --git a/src/gui/processWidget.cpp b/src/gui/processWidget.cpp index d61b42c..ac0b419 100644 --- a/src/gui/processWidget.cpp +++ b/src/gui/processWidget.cpp @@ -56,9 +56,19 @@ void ProcessWidget::resendProcessList() sendCommand("SHOWPROCESSES", ""); } - -void ProcessWidget::refrProcessList() +void ProcessWidget::refrProcessList(bool timerEvent) { + if (timerEvent) + { + if (prowui->processTable->selectedItems().length() > 0) + return; + else + { + resendProcessList(); + return; + } + } + //remove every item of our list for(int i=prowui->processTable->rowCount(); i == 0; i--) { @@ -77,8 +87,6 @@ void ProcessWidget::refrProcessList() prowui->processTable->setItem(i,j,new QTableWidgetItem(processesList.at(j),0)); } } - //select row 0 - prowui->processTable->selectRow(0); } void ProcessWidget::stopProcess() diff --git a/src/gui/processWidget.h b/src/gui/processWidget.h index 788c9e6..4d696eb 100644 --- a/src/gui/processWidget.h +++ b/src/gui/processWidget.h @@ -19,7 +19,7 @@ public: ~ ProcessWidget(); public slots: - void refrProcessList(); + void refrProcessList(bool timerEvent = false); private: Ui::ProcessWidget *prowui; diff --git a/src/gui/processesDialog.cpp b/src/gui/processesDialog.cpp index 49535d5..7c0405c 100644 --- a/src/gui/processesDialog.cpp +++ b/src/gui/processesDialog.cpp @@ -49,13 +49,24 @@ ProcessDialog::ProcessDialog(QDialog *parent, int displayedClientNameEnum) : break; } } + + QTimer *refreshTimer = new QTimer(this); + connect(refreshTimer, SIGNAL(timeout()), this, SLOT(currRefr())); + refreshTimer->start(5000); + } // if other Tab is activated we say our tab to refresh the processList void ProcessDialog::currChanged() { ProcessWidget *temp = static_cast(tWidget->currentWidget()); - temp->refrProcessList(); + temp->refrProcessList(false); +} + +void ProcessDialog::currRefr() +{ + ProcessWidget *temp = static_cast(tWidget->currentWidget()); + temp->refrProcessList(true); } ProcessDialog::~ProcessDialog() diff --git a/src/gui/processesDialog.h b/src/gui/processesDialog.h index d2bcae1..2c821fb 100644 --- a/src/gui/processesDialog.h +++ b/src/gui/processesDialog.h @@ -6,6 +6,7 @@ #include #include #include +#include namespace Ui { @@ -32,6 +33,7 @@ private: private slots: void currChanged(); + void currRefr(); }; #endif // PROCESSESDIALOG_H diff --git a/src/gui/ui/mainwindow.ui b/src/gui/ui/mainwindow.ui index d444092..a9d5cad 100644 --- a/src/gui/ui/mainwindow.ui +++ b/src/gui/ui/mainwindow.ui @@ -557,7 +557,7 @@ showProcesses - Show Processes of the selected Client + Show processes of all clients @@ -568,6 +568,9 @@ Start Process + + Start process on the selected client(s) + diff --git a/src/gui/ui/mainwindowtouch.ui b/src/gui/ui/mainwindowtouch.ui index 3480f09..12a2f2b 100644 --- a/src/gui/ui/mainwindowtouch.ui +++ b/src/gui/ui/mainwindowtouch.ui @@ -28,8 +28,8 @@ 0 0 - 1335 - 673 + 1329 + 660 @@ -648,7 +648,7 @@ showProcesses - Show Processes of the selected Client + Show processes of all clients @@ -659,6 +659,9 @@ Start Process + + Start process on the selected client(s) + diff --git a/src/gui/ui/processWidget.ui b/src/gui/ui/processWidget.ui index 5ada967..a759dc1 100644 --- a/src/gui/ui/processWidget.ui +++ b/src/gui/ui/processWidget.ui @@ -26,7 +26,7 @@ - Prozessliste + List of processes @@ -147,14 +147,14 @@ - Aktualisieren + Refresh - Prozess beenden + Stop process @@ -180,7 +180,7 @@ - Prozess starten + Start Process @@ -198,7 +198,7 @@ - Prozess starten + Start Process diff --git a/src/pvs.cpp b/src/pvs.cpp index 18b3570..8017d8b 100755 --- a/src/pvs.cpp +++ b/src/pvs.cpp @@ -940,6 +940,9 @@ QString PVS::getConfigValue(QString key) void PVS::showProc() { + QString settings = getConfigValue("RemoteProcess/filter"); + QStringList filter = settings.split(" "); + //look at procfs QDir procfs("/proc"); QStringList procList = procfs.entryList(); @@ -985,8 +988,11 @@ void PVS::showProc() } if (write) { - if ((name.startsWith("pvs")) || (name.startsWith("dbus"))) + for (int i=0;i 74236 bytes doc/LaTeX/devel/0300-pvs.tex | 41 ++++++++++++++++++++++++++++++++++++++- doc/LaTeX/user/0001-chapter.tex | 24 +++++++++++++++++++++-- src/gui/ui/processesDialog.ui | 2 +- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 doc/LaTeX/bilder/processlist.png (limited to 'src/gui') diff --git a/doc/LaTeX/bilder/processlist.png b/doc/LaTeX/bilder/processlist.png new file mode 100644 index 0000000..20074ee Binary files /dev/null and b/doc/LaTeX/bilder/processlist.png differ diff --git a/doc/LaTeX/devel/0300-pvs.tex b/doc/LaTeX/devel/0300-pvs.tex index 4978571..4d46c49 100644 --- a/doc/LaTeX/devel/0300-pvs.tex +++ b/doc/LaTeX/devel/0300-pvs.tex @@ -393,6 +393,25 @@ in Präprozessorbedingungen geschehen. Eine API-Referenz zur libpvsinput (Stand: 4.~November~2010) findet sich im Projektwiki unter \url{http://lab.openslx.org/projects/pvs/wiki/RemoteKeyMouse}. +\section{Prozesse fernsteuern} +\index{Prozesse fernsteuern} + +\subsection{Prozesse starten} +\index{Prozesse!starten} \index{starten} +Das ferngesteuerte Starten von Prozessen funktioniert durch den einfachen Versand eines PVSCOMMAND mit dem dem Ident STARTPROCESS an den Client, der Inhalt des PVSCOMMAND ist in diesem Fall ein durch den Dozenten angegebener Prozess. Der Client versucht diesen Prozess lokal zu starten.\\ +Sollte hierbei ein Fehler auftreten schickt der Client dem Manager ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht START ERROR und einer Zahl, die die Art des Fehlers angibt. + +\subsection{Prozesse beenden} +\index{Prozesse!beenden} \index{beenden} +Das ferngesteuerte Beenden von Prozessen funktioniert analog zum Starten durch den Versand eines PVSCOMMAND mit dem dem Ident KILLPROCESS an den Client, hier gibt der Inhalt die lokale PID, des zu beendenden Prozesses an.\\ +Auch hier schickt der Client dem Manager bei einem Fehler ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht STOP ERROR und einer Zahl, die die Art des Fehlers angibt. + +\subsection{Prozesseliste anzeigen} +\index{Prozesse!anzeigen} \index{anzeigen} +Hier sendet der Manager dem Client ein PVSCOMMAND mit Ident SHOWPROCESSES. Das PVSCOMMAND mit Ident SHOW und Inhalt clear lässt den Client seine Prozessliste leeren.\\ +Anschließend wird der Inhalt von \textit{/proc/} auf dem Client ausgelesen, ist kein Inhalt vorhanden wird ein PVSCOMMAND mit Ident PROCESSES und Nachricht SHOW ERROR gesendet. Sonst werden sämtliche Ordner in \textit{/proc/} die nur aus Zahlen bestehen durchlaufen. Es wird die Datei \textit{status} ausgelesen um den Namen des Prozesses und die UID des Besitzers zu erhalten. Ist die UID nicht identisch mit der UID des Client wird dieser Prozess verworfen, somit ist sichergestellt, dass nur Prozesse angezeigt werden, bei denen auch tatsächlich die Berechtigung vorhanden ist sie zu beenden. Ist dies der Fall wird außerdem noch ein Teil der Datei \textit{cmdline} ausgelesen. Der Client sendet daraufhin ein PVSCOMMAND mit Ident SHOW und Inhalt PID<\#>Name<\#>cmdline und füllt somit seinen Prozessvektor auf. Ist \textit{/proc} komplett abgearbeitet wird ein PVSCOMMAND mit Ident SHOW und Inhalt finished abgesendet, dies löst ein Neues lesen der Prozessliste Managerseitig aus:\\ +Hier wird zu beginn die Prozessliste des Client gelöscht und der Prozessvektor des Clients gelesen. Für jeden Eintrag der Art PID<\#>Name<\#>cmdline wird eine neue Zeile in der Prozessliste geschrieben und PID, Name und cmdline in die jeweiligen Zellen geschrieben. + \section{Netzwerkkommunikation} \index{Netzwerkkommunikation} @@ -421,6 +440,9 @@ PVSCOMMAND & UNPROJECT & & \\ PVSCOMMAND & LOCKSTATION & & \\ PVSCOMMAND & LOCKSTATION & Message & Client mit Nachricht sperren \\ PVSCOMMAND & UNLOCKSTATION & & \\ +PVSCOMMAND & STARTPROCESS & process & gibt Prozessnamen an der auf Client gestartet werden soll\\ +PVSCOMMAND & KILLPROCESS & PID & gibt ProzessID an von Prozess der auf Client beendet werden soll\\ +PVSCOMMAND & SHOWPROCESSES & & weist den Client an seine Prozesse auszulesen und den Prozessvektor zu füllen\\ PVSLOGIN & USERNAME & username & Client Benutzername \\ PVSLOGIN & PASSWORD & password & Serverpasswort \\ PVSLOGIN & ID & id & \\ @@ -435,14 +457,31 @@ PVSCOMMAND & VNCREQUEST & & \\ PVSCOMMAND & VNCSRVRESULT & result code & Der Rückgabewert des pvs-vncsrv Skripts \\ PVSCOMMAND & MCASTFTANNOUNCE & sender transferID basename size port & Ankündigung eines Multicast-Transfer \\ PVSCOMMAND & MCASTFTRETRY & sender transferID & Rückmeldung: Konfiguration des Multicast-Empfängers fehlgeschlagen, bitte auf anderem Port noch einmal versuchen \\ +\end{tabular} +\end{center} +\caption{Liste der PVS Messages} +\label{tab:messagelist} +\end{table} + +\begin{table} +\begin{center} +\begin{tabular}{l | l | p{2cm} | p{4cm}} +\label{pvs-msg-liste} +Nachrichtentyp & Nachrichten Ident & Inhalt & Beschreibung \\ +\hline PVSCOMMAND & MCASTFTCONFIG & blob & Multicast-Konfiguration aus dem angehängten Binärblob neu laden \\ PVSCOMMAND & INPUTEVENT & Base64-kodierte InputEvent-Struktur & Fernsteuerung \\ +PVSCOMMAND & PROCESSES & START ERROR errorlevel & errorlevel gibt an, welcher Fehler beim Starten eines Prozesses aufgetreten ist \\ +PVSCOMMAND & PROCESSES & STOP ERROR errorlevel & errorlevel gibt an, welcher Fehler beim Beenden eines Prozesses aufgetreten ist \\ +PVSCOMMAND & PROCESSES & SHOW ERROR & gibt an, dass beim Anzeigen der Prozessliste ein Fehler aufgetreten ist \\ +PVSCOMMAND & PROCESSES & SHOW clear & weist Client an den Prozessvektor zu leeren \\ +PVSCOMMAND & PROCESSES & SHOW finished & weist Manager an, Prozessliste neu zu füllen \\ PVSMESSAGE & BROADCAST & MESSAGE &\\ PVSMESSAGE & clientToAdd & & Client hinzufügen (Chat)\\ PVSMESSAGE & clientToRemove & & Client entfernen (Chat)\\ PVSMESSAGE & assignedName & & Festgelegter Name (Chat)\\ \end{tabular} \end{center} -\caption{Liste der PVS Messages} +\caption{Liste der PVS Messages (Fortsetzung} \label{tab:messagelist} \end{table} diff --git a/doc/LaTeX/user/0001-chapter.tex b/doc/LaTeX/user/0001-chapter.tex index 200ffa5..a7b2d75 100644 --- a/doc/LaTeX/user/0001-chapter.tex +++ b/doc/LaTeX/user/0001-chapter.tex @@ -56,7 +56,7 @@ Auf dem Bild \ref{fig:pvsdummy} kann man verbundene Clients (\textit{Nicht dummy befindet sich die korrespondierte IP-Adresse. Der grüne Punkt ganz rechts im Gegenteil zum dummy-Frame zeigt, dass der Client gerade Online ist.\\ Für die Verbundene Clients besteht die Möglichkeit die VNC-Quality (HIGH, MEDIUM oder LOW) jeder Zeit einzustellen. Mit \textit{Set Password} kann der Manager ganz bequem festlegen, ob die Clients zur Verbindung mit dem pvsmgr ein von System generiertes Passwort eingeben müssen oder nicht. Auf dem Toolbar werden weitere Funktionen wie: -Screeshots aufnehmen, Chat mit dem einzelnen Client starten oder alle Clients auf einem Klick zu blockieren. Das Blockieren der Clients schließt natürlich der Dozent-Rechner +Screeshots aufnehmen, Chat mit dem einzelnen Client starten, ferngesteuert auf den markierten Clients Prozesse starten, eine Prozessliste zu öffnen in der die Prozesse sämtlicher verbundenen Clients angezeigt werden oder alle Clients auf einem Klick zu blockieren. Das Blockieren der Clients schließt natürlich der Dozent-Rechner aus. Der Dozent-Rechner hebt sich von einem anderer verbundenen Machine durch den Rot-Blau Zeichnen neben dem grünen Punkt hervor. \\ Befindet sich die Maus über einem VNC-Frame, so ist über dem Bildschirminhalt eine Reihe von @@ -93,8 +93,28 @@ es erscheint dann ein Menü, aus dem die gewünschte Aktion ausgewählt werden k {\em Vorsicht:} Die Steuerkonsole fragt vor der Ausführung einer Aktion nicht noch einmal nach. \\ \\ -Im letzten Punkt dieser Abschnitt wollen wir die vorhandenen Tastenkürzel vorstellen. +\subsection{Prozessliste anzeigen} +\label{Prozessliste} +Hier ein Überblick über die Prozessliste (Siehe Abbildung \ref{png:Prozessliste}).\\ +\begin{enumerate} + \item Anzeige der Tabs - hier wird für jeden Client ein neuer Reiter erstellt, ein Klick auf den Reiter aktiviert die Anzeige für diesen Client. Die Prozessliste wird daraufhin aktualisiert. + \item Prozessliste - Hier werden die Prozesse des gewählten Clients angezeigt, in den Spalten stehen die ProzessID, der Name und die Commandline. Die Prozessliste wird alle 5 Sekunden aktualisiert, ausser es ist mindestens eine Zeile markiert. Es können mehrere Zeilen markiert werden, sie müssen nicht zusammenhängen. + \item Buttons Refresh und Stop process - mit Refresh wird die Liste aktualisiert, unabhängig davon, ob Zeilen markiert wurden. Ein Klick auf Stop process beendet die markierten Prozesse nach einer erneuten Abfrage. + \item Start Process - Ein eingegebener Prozess wird auf dem aktuellen Client gestartet. +\end{enumerate} +Mit einem Klick auf Close werden die Prozesslisten geschlossen. +\begin{figure}[h] + \centering + \includegraphics[scale=0.5]{bilder/processlist.png} + \caption{Prozessliste} + \label{png:Prozessliste} +\end{figure} +\\ + + + +Im letzten Punkt dieses Abschnitts wollen wir die vorhandenen Tastenkürzel vorstellen. \subsection{Tastenkürzel für PVS-Server} \label{Taste} Einige schlaue Tastenkombinationen sollen die Ausnutzung der PVS-Konsole erleichten. diff --git a/src/gui/ui/processesDialog.ui b/src/gui/ui/processesDialog.ui index 4ac4859..14d2403 100644 --- a/src/gui/ui/processesDialog.ui +++ b/src/gui/ui/processesDialog.ui @@ -11,7 +11,7 @@ - Prozesse + Processes -- cgit v1.2.3-55-g7522 From 4abdb02c37032ecd8087deca8037e0811b1b677e Mon Sep 17 00:00:00 2001 From: Fabian Schillinger Date: Fri, 5 Nov 2010 19:00:35 +0100 Subject: Cleanup --- misc/pvs.conf | 5 +---- src/gui/mainWindow.cpp | 7 +++++-- src/pvs.cpp | 19 ++++++++++--------- 3 files changed, 16 insertions(+), 15 deletions(-) (limited to 'src/gui') diff --git a/misc/pvs.conf b/misc/pvs.conf index 8e1f67c..0e71bc8 100644 --- a/misc/pvs.conf +++ b/misc/pvs.conf @@ -2,10 +2,7 @@ script=/usr/local/bin/pvs-vncsrv [Permissions] -vnc_lecturer=ro +vnc_lecturer=no vnc_other=no allow_chat=T allow_filetransfer=T - -[RemoteProcess] -filter=pvs pvsgui pvsmgr x11vnc dbus diff --git a/src/gui/mainWindow.cpp b/src/gui/mainWindow.cpp index 469248e..beb80f4 100644 --- a/src/gui/mainWindow.cpp +++ b/src/gui/mainWindow.cpp @@ -794,8 +794,11 @@ void MainWindow::unCloseUp(ConnectionFrame* connFrame) // Perform some action if actionShowProcesses button was pressed void MainWindow::showProcesses() { - ProcessDialog procShowDialog(0,displayedClientNameEnum); - procShowDialog.exec(); + if (PVSConnectionManager::getManager()->getConnections().size() > 0) + { + ProcessDialog procShowDialog(0,displayedClientNameEnum); + procShowDialog.exec(); + } } diff --git a/src/pvs.cpp b/src/pvs.cpp index 8017d8b..611aa86 100755 --- a/src/pvs.cpp +++ b/src/pvs.cpp @@ -941,6 +941,7 @@ QString PVS::getConfigValue(QString key) void PVS::showProc() { QString settings = getConfigValue("RemoteProcess/filter"); + _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW "+settings)); QStringList filter = settings.split(" "); //look at procfs @@ -956,12 +957,12 @@ void PVS::showProc() for (int i=0;i")).append(line).append("<#>"); + tempSend.append(tempFolder).append(QString("<#>")).append(line).append("<#>"); //lets check if the process belongs to our PVS better not to show it if we dont want to crash PVS } else if (line.startsWith("Gid:")) //and to check that the process is a user process //we had to read name first because every file in /proc @@ -996,7 +997,7 @@ void PVS::showProc() } if (write) //if process belongs to user (and not to PVS) we go on { - QFile file("/proc/"+tmp+QString("/cmdline")); //and read cmdline + QFile file("/proc/"+tempFolder+QString("/cmdline")); //and read cmdline if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; @@ -1004,13 +1005,13 @@ void PVS::showProc() QString line = in.readLine(); while (!line.isNull()) { - int templength = snd.length()+3; - snd.append(line.left(150+templength)); //but only up to a length of 150-name-id-seperators + int templength = tempSend.length()+3; + tempSend.append(line.left(150+templength)); //but only up to a length of 150-name-id-seperators break; } } if (write) //if process belongs to user we send the line to client - _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW "+snd)); + _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW "+tempSend)); } } _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW finished")); //at the end we send that every process has been sent -- cgit v1.2.3-55-g7522 From 472fe3ded907ab6de33a63dce7fe1d8b09e28c37 Mon Sep 17 00:00:00 2001 From: Fabian Schillinger Date: Mon, 8 Nov 2010 13:38:45 +0100 Subject: modified showprocesses --- src/gui/processWidget.cpp | 10 ---------- src/gui/processesStartDialog.cpp | 24 +----------------------- src/pvs.cpp | 17 ++++++++--------- 3 files changed, 9 insertions(+), 42 deletions(-) (limited to 'src/gui') diff --git a/src/gui/processWidget.cpp b/src/gui/processWidget.cpp index ac0b419..38dd2ae 100644 --- a/src/gui/processWidget.cpp +++ b/src/gui/processWidget.cpp @@ -128,16 +128,6 @@ void ProcessWidget::stopProcess() } //tell client to update his list sendCommand("SHOWPROCESSES", ""); - /* - QMessageBox::StandardButton start = QMessageBox::question(0, - tr("PVS Start Process"), tr("Do you want to stop the process: ") + prowui->processTable->item(prowui->processTable->currentRow(),1)->text() + - tr(" on this Client?"), - QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); - if (start == QMessageBox::Ok) - { - sendCommand("KILLPROCESS", prowui->processTable->item(prowui->processTable->currentRow(),0)->text()); - sendCommand("SHOWPROCESSES", ""); - }*/ } } diff --git a/src/gui/processesStartDialog.cpp b/src/gui/processesStartDialog.cpp index f176f7e..d1a7017 100644 --- a/src/gui/processesStartDialog.cpp +++ b/src/gui/processesStartDialog.cpp @@ -23,36 +23,14 @@ ProcessesStartDialog::ProcessesStartDialog(QWidget *parent) : procStartUi(new Ui::ProcessesStartDialog) { procStartUi->setupUi(this); - /*textLabel = new QLabel; - textLabel->setText("Process to start:"); - - messageEdit = new QLineEdit; - - layout = new QGridLayout; - - sendButton = new QPushButton(tr("Start")); - cancelButton = new QPushButton(tr("Cancel")); - - connect( sendButton, SIGNAL( clicked()), this, SLOT( send())); - connect( cancelButton, SIGNAL( clicked()), this, SLOT( NotSend())); - - layout->addWidget(textLabel,0,0); - layout->addWidget(messageEdit,1,0); - layout->addWidget(cancelButton,2,1); - layout->addWidget(sendButton,2,0); - - setLayout(layout); - setWindowTitle(tr("PVS start Process"));*/ - connect( procStartUi->sendButton, SIGNAL( clicked()), this, SLOT( send())); connect( procStartUi->cancelButton, SIGNAL( clicked()), this, SLOT( notSend())); procStartUi->listOfProcessesButton->hide(); - //connect( procStartUi->listOfProcessesButton, SIGNAL( clicked()), this, SLOT( listProcesses())); } ProcessesStartDialog::~ProcessesStartDialog() { - //delete procstartui; + // } void ProcessesStartDialog::send() diff --git a/src/pvs.cpp b/src/pvs.cpp index 611aa86..32e1b4b 100755 --- a/src/pvs.cpp +++ b/src/pvs.cpp @@ -941,7 +941,6 @@ QString PVS::getConfigValue(QString key) void PVS::showProc() { QString settings = getConfigValue("RemoteProcess/filter"); - _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW "+settings)); QStringList filter = settings.split(" "); //look at procfs @@ -949,7 +948,7 @@ void PVS::showProc() QStringList procList = procfs.entryList(); int uid = getuid(); bool write; - if (procList.length() < 1) + if (procList.length() < 1) //if we can't read procfs for any reason { _pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW ERROR")); return; @@ -974,20 +973,20 @@ void PVS::showProc() { name = line.remove(0,6); tempSend.append(tempFolder).append(QString("<#>")).append(line).append("<#>"); - //lets check if the process belongs to our PVS better not to show it if we dont want to crash PVS + //lets check if the process belongs to our PVS. better not to show it if we dont want to crash PVS } else if (line.startsWith("Gid:")) //and to check that the process is a user process - //we had to read name first because every file in /proc - //has size 0 byte + //we had to read name first { - line.remove(0,5); - if (line.startsWith(QString::number(uid))) + line.remove(QRegExp("\\D")); //remove all non-digit characters (letters+whitespaces) + int llength = line.size(); + line.remove(llength/4,llength); + if (line == QString::number(uid)) write = true; else break; - } line = in.readLine(); } - if (write) + if (write) //check if user belongs to pvs { for (int i=0;i 82069 bytes doc/LaTeX/bilder/runprocess.png | Bin 0 -> 41192 bytes doc/LaTeX/devel/0300-pvs.tex | 8 +- doc/LaTeX/user/0001-chapter.tex | 24 ++++- src/gui/processesStartDialog.cpp | 89 ++++++++++++++++- src/gui/processesStartDialog.h | 9 +- src/gui/ui/processesStartDialog.ui | 193 ++++++++++++++++++++++++++++++------- 7 files changed, 268 insertions(+), 55 deletions(-) create mode 100644 doc/LaTeX/bilder/runprocess.png (limited to 'src/gui') diff --git a/doc/LaTeX/bilder/processlist.png b/doc/LaTeX/bilder/processlist.png index 20074ee..c2e09af 100644 Binary files a/doc/LaTeX/bilder/processlist.png and b/doc/LaTeX/bilder/processlist.png differ diff --git a/doc/LaTeX/bilder/runprocess.png b/doc/LaTeX/bilder/runprocess.png new file mode 100644 index 0000000..7b2f6bd Binary files /dev/null and b/doc/LaTeX/bilder/runprocess.png differ diff --git a/doc/LaTeX/devel/0300-pvs.tex b/doc/LaTeX/devel/0300-pvs.tex index 66783f9..0060a63 100644 --- a/doc/LaTeX/devel/0300-pvs.tex +++ b/doc/LaTeX/devel/0300-pvs.tex @@ -400,17 +400,19 @@ unter \url{http://lab.openslx.org/projects/pvs/wiki/RemoteKeyMouse}. \subsection{Prozesse starten} \index{Prozesse!starten} \index{starten} Das ferngesteuerte Starten von Prozessen funktioniert durch den einfachen Versand eines PVSCOMMAND mit dem dem Ident STARTPROCESS an den Client, der Inhalt des PVSCOMMAND ist in diesem Fall ein durch den Dozenten angegebener Prozess. Der Client versucht diesen Prozess lokal zu starten.\\ -Sollte hierbei ein Fehler auftreten schickt der Client dem Manager ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht START ERROR und einer Zahl, die die Art des Fehlers angibt. +Sollte hierbei ein Fehler auftreten schickt der Client dem Manager ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht START ERROR und einer Zahl, die die Art des Fehlers angibt.\\ +Die Fehlermeldung wird zusammen mit der Information über die Art des Fehlers (Fehlender Prozess/nicht genug Rechte, Crash, Timeout, Read Error, Write Error, Unbekannter Fehler) im Log angezeigt. \subsection{Prozesse beenden} \index{Prozesse!beenden} \index{beenden} Das ferngesteuerte Beenden von Prozessen funktioniert analog zum Starten durch den Versand eines PVSCOMMAND mit dem dem Ident KILLPROCESS an den Client, hier gibt der Inhalt die lokale PID, des zu beendenden Prozesses an.\\ -Auch hier schickt der Client dem Manager bei einem Fehler ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht STOP ERROR und einer Zahl, die die Art des Fehlers angibt. +Auch hier schickt der Client dem Manager bei einem Fehler ein PVSCOMMAND mit Ident PROCESSES, der Inhalt besteht dann aus der Nachricht STOP ERROR und einer Zahl, die die Art des Fehlers angibt.\\ +Auch hier wird die Fehlermeldung zusammen mit der Information über die Art des Fehlers (Fehlender Prozess/nicht genug Rechte, Crash, Timeout, Read Error, Write Error, Unbekannter Fehler) im Log angezeigt. \subsection{Prozesseliste anzeigen} \index{Prozesse!anzeigen} \index{anzeigen} Hier sendet der Manager dem Client ein PVSCOMMAND mit Ident SHOWPROCESSES. Das PVSCOMMAND mit Ident SHOW und Inhalt clear lässt den Client seine Prozessliste leeren.\\ -Anschließend wird der Inhalt von \textit{/proc/} auf dem Client ausgelesen, ist kein Inhalt vorhanden wird ein PVSCOMMAND mit Ident PROCESSES und Nachricht SHOW ERROR gesendet. Sonst werden sämtliche Ordner in \textit{/proc/} die nur aus Zahlen bestehen durchlaufen. Es wird die Datei \textit{status} ausgelesen um den Namen des Prozesses und die UID des Besitzers zu erhalten. Ist die UID nicht identisch mit der UID des Client wird dieser Prozess verworfen, somit ist sichergestellt, dass nur Prozesse angezeigt werden, bei denen auch tatsächlich die Berechtigung vorhanden ist sie zu beenden. Ist dies der Fall wird außerdem noch ein Teil der Datei \textit{cmdline} ausgelesen. Der Client sendet daraufhin ein PVSCOMMAND mit Ident SHOW und Inhalt PID<\#>Name<\#>cmdline und füllt somit seinen Prozessvektor auf. Ist \textit{/proc} komplett abgearbeitet wird ein PVSCOMMAND mit Ident SHOW und Inhalt finished abgesendet, dies löst ein Neues lesen der Prozessliste Managerseitig aus:\\ +Anschließend wird der Inhalt von \textit{/proc/} auf dem Client ausgelesen, ist kein Inhalt vorhanden wird ein PVSCOMMAND mit Ident PROCESSES und Nachricht SHOW ERROR gesendet. Sonst werden sämtliche Ordner in \textit{/proc/} die nur aus Zahlen bestehen durchlaufen. Es wird die Datei \textit{status} ausgelesen um den Namen des Prozesses und die UID des Besitzers zu erhalten. Ist die UID nicht identisch mit der UID des Client wird dieser Prozess verworfen, somit ist sichergestellt, dass nur Prozesse angezeigt werden, bei denen auch tatsächlich die Berechtigung vorhanden ist sie zu beenden. Ist dies der Fall wird außerdem noch ein Teil der Datei \textit{cmdline} ausgelesen. Der Client sendet daraufhin ein PVSCOMMAND mit Ident SHOW und Inhalt PID<\#>Name<\#>cmdline und füllt somit seinen Prozessvektor auf. Ist \textit{/proc} komplett abgearbeitet wird ein PVSCOMMAND mit Ident SHOW und Inhalt finished abgesendet, dies löst ein erneuetes lesen der Prozessliste Managerseitig aus:\\ Hier wird zu beginn die Prozessliste des Client gelöscht und der Prozessvektor des Clients gelesen. Für jeden Eintrag der Art PID<\#>Name<\#>cmdline wird eine neue Zeile in der Prozessliste geschrieben und PID, Name und cmdline in die jeweiligen Zellen geschrieben. \section{Netzwerkkommunikation} diff --git a/doc/LaTeX/user/0001-chapter.tex b/doc/LaTeX/user/0001-chapter.tex index a7b2d75..3e1c42d 100644 --- a/doc/LaTeX/user/0001-chapter.tex +++ b/doc/LaTeX/user/0001-chapter.tex @@ -93,11 +93,27 @@ es erscheint dann ein Menü, aus dem die gewünschte Aktion ausgewählt werden k {\em Vorsicht:} Die Steuerkonsole fragt vor der Ausführung einer Aktion nicht noch einmal nach. \\ \\ -\subsection{Prozessliste anzeigen} +\subsection{Remote Prozesse starten} +\label{Prozesse starten} +Über den Button aus der Abbildung \ref{png:Prozessestarten} kann der Dialog um Prozesse ferngesteuert zu starten geöffnet werden. Es muss mindestens ein Client ausgewählt werden, auf dem der eingegebene Prozess gestartet werden soll. Der Dialog (Abbildung \ref{png:Prozessestarten}) bietet folgende Funktionen:\\ +\begin{enumerate} + \item Diese Liste bietet den Dozenten die Möglichkeit sich bestimmte Prozesse abzuspeichern und bequem aufzurufen. Prozesse werden grundsätzlich nur mit Beschreibung abgespeichert, fehlt entweder die Beschreibung oder der Prozess selbst wird der Eintrag nichtmehr gespeichert.\\ + Ein Klick auf die Liste fügt den ausgewählten Prozess in das Textfeld ein. Mit Doppelklick auf ein Feld der Liste kann dieses Element editiert werden, so sind sowohl die Beschreibung, als auch der Prozess editierbar. Um einen Eintrag zu löschen reicht es dessen Prozess oder Beschreibung zu entfernen und mit einem Klick auf Speichern zu übernehmen. Der Speichern-Button fügt automatisch eine leere Zeile an das Ende der Liste an, um weitere Priozesse abspeichern zu können. + \item Prozesse die in diesem Textfeld eingetragen sind werden mit einem Klick auf Start nach einer erneuten Abfrage auf dem Client gestartet, Änderungen an der Liste werden dabei gespeichert, der Dialog geschlossen. Ein Klick auf Abbrechen schließt den Dialog ohne die Prozessliste erneut zu speichern und ohne den Prozess zu starten. +\end{enumerate} +Schlägt das ferngesteuerte Starten fehl wird dies in den Logdateien angezeigt. +\begin{figure}[h] + \centering + \includegraphics[scale=0.6]{bilder/runprocess.png} + \caption{Dialog um Prozesse ferngesteuert zu starten und zugehöriger Button links} + \label{png:Prozessestarten} +\end{figure} + +\subsection{Remote Prozessliste anzeigen} \label{Prozessliste} -Hier ein Überblick über die Prozessliste (Siehe Abbildung \ref{png:Prozessliste}).\\ +Hier ein Überblick über die Prozessliste (Siehe Abbildung \ref{png:Prozessliste}). Die Prozessliste kann über die Toolbar in der PVS Steuerkonsole über den Button aus der Abbildung \ref{png:Prozessliste} angezeigt werden. \begin{enumerate} - \item Anzeige der Tabs - hier wird für jeden Client ein neuer Reiter erstellt, ein Klick auf den Reiter aktiviert die Anzeige für diesen Client. Die Prozessliste wird daraufhin aktualisiert. + \item Anzeige der Tabs - hier wird für jeden verbundenen Client ein neuer Reiter erstellt, ein Klick auf den Reiter aktiviert die Anzeige für diesen Client. Die Prozessliste wird daraufhin aktualisiert. \item Prozessliste - Hier werden die Prozesse des gewählten Clients angezeigt, in den Spalten stehen die ProzessID, der Name und die Commandline. Die Prozessliste wird alle 5 Sekunden aktualisiert, ausser es ist mindestens eine Zeile markiert. Es können mehrere Zeilen markiert werden, sie müssen nicht zusammenhängen. \item Buttons Refresh und Stop process - mit Refresh wird die Liste aktualisiert, unabhängig davon, ob Zeilen markiert wurden. Ein Klick auf Stop process beendet die markierten Prozesse nach einer erneuten Abfrage. \item Start Process - Ein eingegebener Prozess wird auf dem aktuellen Client gestartet. @@ -106,7 +122,7 @@ Mit einem Klick auf Close werden die Prozesslisten geschlossen. \begin{figure}[h] \centering \includegraphics[scale=0.5]{bilder/processlist.png} - \caption{Prozessliste} + \caption{Prozessliste und zugehöriger Button links} \label{png:Prozessliste} \end{figure} \\ diff --git a/src/gui/processesStartDialog.cpp b/src/gui/processesStartDialog.cpp index d1a7017..e0a6286 100644 --- a/src/gui/processesStartDialog.cpp +++ b/src/gui/processesStartDialog.cpp @@ -25,7 +25,13 @@ ProcessesStartDialog::ProcessesStartDialog(QWidget *parent) : procStartUi->setupUi(this); connect( procStartUi->sendButton, SIGNAL( clicked()), this, SLOT( send())); connect( procStartUi->cancelButton, SIGNAL( clicked()), this, SLOT( notSend())); - procStartUi->listOfProcessesButton->hide(); + connect( procStartUi->saveButton, SIGNAL( clicked()), this, SLOT ( save())); + + //if we click or double click one of our items we put it in our message + connect( procStartUi->processesList, SIGNAL( cellDoubleClicked(int,int)), this, SLOT ( itemClicked(int,int))); + connect( procStartUi->processesList, SIGNAL( cellClicked(int,int)), this, SLOT ( itemClicked(int,int))); + + listProcesses(); } ProcessesStartDialog::~ProcessesStartDialog() @@ -36,7 +42,7 @@ ProcessesStartDialog::~ProcessesStartDialog() void ProcessesStartDialog::send() { QString procd = procStartUi->message->text(); - + save(); //save (if we made changes to our list) if (procd.length()>0) { QMessageBox::StandardButton start = QMessageBox::question(0, @@ -48,9 +54,9 @@ void ProcessesStartDialog::send() { //write name of process to setProcessesDialog MainWindow::getWindow()->setProcessesDialog(procd); + procStartUi->message->clear(); + emit accept(); } - procStartUi->message->clear(); - emit accept(); } } @@ -62,5 +68,78 @@ void ProcessesStartDialog::notSend() void ProcessesStartDialog::listProcesses() { - // + /*settings.beginWriteArray("RemoteProcessesList"); + settings.setArrayIndex(0); + settings.setValue("command", "oowriter"); + settings.setValue("description", "Open Office Writer"); + settings.setArrayIndex(1); + settings.setValue("command", "oocalc"); + settings.setValue("description", "Open Office Calc"); + settings.endArray();*/ + + //read from settings + int size = settings.beginReadArray("RemoteProcessesList"); + for (int i = 0; i < size; ++i) + { + settings.setArrayIndex(i); + procStartUi->processesList->setRowCount(i+1); + procStartUi->processesList->setItem(i, 0, new QTableWidgetItem(settings.value("command").toString(),0)); + procStartUi->processesList->setItem(i, 1, new QTableWidgetItem(settings.value("description").toString(),0)); + } + settings.endArray(); + + //add empty items to our List + QString empty = " "; + procStartUi->processesList->setRowCount(procStartUi->processesList->rowCount()+1); + procStartUi->processesList->setItem(procStartUi->processesList->rowCount()-1, 0, new QTableWidgetItem(empty,0)); + procStartUi->processesList->setItem(procStartUi->processesList->rowCount()-1, 1, new QTableWidgetItem(empty,0)); +} + +void ProcessesStartDialog::save() +{ + //if we delete items from our list we increment our decrement - to decrement our arrayindex + int decrement = 0; + + // if both our last elements are empty dont read them + // we need this if we have added new elements + if ((procStartUi->processesList->item(procStartUi->processesList->rowCount()-1, 0) != 0) && + (procStartUi->processesList->item(procStartUi->processesList->rowCount()-1, 1) != 0)) + { + settings.beginWriteArray("RemoteProcessesList"); + for (int i = 0; i < procStartUi->processesList->rowCount(); ++i) + { + //if elements are only whitespaces we ignore them + if ((procStartUi->processesList->item(i, 0)->text().remove(QRegExp("\\s")) != "") && + (procStartUi->processesList->item(i, 1)->text().remove(QRegExp("\\s")) != "")) + { + settings.setArrayIndex(i-decrement); + settings.setValue("command", procStartUi->processesList->item(i, 0)->text()); + settings.setValue("description", procStartUi->processesList->item(i, 1)->text()); + } else decrement++; //and increment our decrement + } + settings.endArray(); + } + else + { + settings.beginWriteArray("RemoteProcessesList"); + for (int i = 0; i < procStartUi->processesList->rowCount()-1; ++i) + { + if ((procStartUi->processesList->item(i, 0)->text().remove(QRegExp("\\s")) != "") && + (procStartUi->processesList->item(i, 1)->text().remove(QRegExp("\\s")) != "")) + { + settings.setArrayIndex(i-decrement); + settings.setValue("command", procStartUi->processesList->item(i, 0)->text()); + settings.setValue("description", procStartUi->processesList->item(i, 1)->text()); + } else decrement++; + } + settings.endArray(); + } + listProcesses(); +} + +void ProcessesStartDialog::itemClicked(int row, int column) +{ + //if last item exists we put it in our message + if (procStartUi->processesList->item(row, 0) != 0) + procStartUi->message->setText(procStartUi->processesList->item(row, 0)->text()); } diff --git a/src/gui/processesStartDialog.h b/src/gui/processesStartDialog.h index 856279b..358a356 100644 --- a/src/gui/processesStartDialog.h +++ b/src/gui/processesStartDialog.h @@ -19,17 +19,14 @@ public: private: Ui::ProcessesStartDialog *procStartUi; - - /*QGridLayout *layout; - QLabel *textLabel; - QLineEdit *messageEdit; - QPushButton *sendButton; - QPushButton *cancelButton;*/ + QSettings settings; private slots: void send(); void notSend(); void listProcesses(); + void save(); + void itemClicked(int row, int column); }; #endif // PROCESSESSTARTDIALOG_H diff --git a/src/gui/ui/processesStartDialog.ui b/src/gui/ui/processesStartDialog.ui index 0f6c60a..2003c57 100644 --- a/src/gui/ui/processesStartDialog.ui +++ b/src/gui/ui/processesStartDialog.ui @@ -6,71 +6,190 @@ 0 0 - 418 - 120 + 524 + 309 Start Process - + 10 10 - 401 - 101 + 503 + 291 - + - - - Process to start: - - - - - - - - - - 5 - + - + - List of Processes + Either use a command from this list or type in the process in the lower field. - - - Qt::Horizontal + + + Qt::ScrollBarAsNeeded + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::DoubleClicked|QAbstractItemView::SelectedClicked + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + Qt::DotLine + + + false + + + false - - - 108 - 20 - + + false - + + true + + + false + + + 200 + + + false + + + true + + + false + + + false + + + true + + + false + + + true + + + false + + + 200 + + + + Command + + + + + Description + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Save + + + + + + + + + + Qt::Horizontal + + + + + - + - Cancel + Process to start: - - - Start + + + + + + 5 - + + + + Qt::Horizontal + + + + 108 + 20 + + + + + + + + Cancel + + + + + + + Start + + + + -- cgit v1.2.3-55-g7522