summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDirk von Suchodoletz2010-11-13 10:49:05 +0100
committerDirk von Suchodoletz2010-11-13 10:49:05 +0100
commitb56d83075d0fe6e9f7f029769b294d6739c357e8 (patch)
tree7174295ffb97f7251e8e8d3cf0721331dac76057
parentWeitere Änderungen an der Doku ... (diff)
parentmodified documentation (diff)
downloadpvs-b56d83075d0fe6e9f7f029769b294d6739c357e8.tar.gz
pvs-b56d83075d0fe6e9f7f029769b294d6739c357e8.tar.xz
pvs-b56d83075d0fe6e9f7f029769b294d6739c357e8.zip
Merge branch 'master' of openslx.org:pvs
-rw-r--r--doc/LaTeX/Makefile20
-rw-r--r--doc/LaTeX/bilder/FictionalPolicyChainClassDiagram.diabin0 -> 1330 bytes
-rw-r--r--doc/LaTeX/bilder/ImplementedPolicies.diabin0 -> 3297 bytes
-rw-r--r--doc/LaTeX/bilder/InputEventHandlerChain-Sequence.diabin0 -> 2702 bytes
-rw-r--r--doc/LaTeX/bilder/InputEventHandlerClassDiagram.diabin0 -> 2770 bytes
-rw-r--r--doc/LaTeX/bilder/PVSPrivInputDArchitecture.diabin0 -> 3137 bytes
-rw-r--r--doc/LaTeX/bilder/PhasesOfKeyboardHandling.diabin0 -> 1695 bytes
-rw-r--r--doc/LaTeX/bilder/PolicyChainClassDiagram.diabin0 -> 1844 bytes
-rw-r--r--doc/LaTeX/bilder/SayHelloHandler-PolicyHier.diabin0 -> 1749 bytes
-rw-r--r--doc/LaTeX/bilder/UebertragungsEbenen.diabin0 -> 1994 bytes
-rw-r--r--doc/LaTeX/bilder/processlist.pngbin74236 -> 82069 bytes
-rw-r--r--doc/LaTeX/bilder/runprocess.pngbin0 -> 41192 bytes
-rw-r--r--doc/LaTeX/devel/0300-pvs.tex33
-rw-r--r--doc/LaTeX/intro/0000-chapter.tex4
-rw-r--r--doc/LaTeX/intro/0100-funktionen.tex2
-rw-r--r--doc/LaTeX/user/0001-chapter.tex24
-rw-r--r--src/gui/processWidget.cpp17
-rw-r--r--src/gui/processWidget.h2
-rw-r--r--src/gui/processesStartDialog.cpp89
-rw-r--r--src/gui/processesStartDialog.h9
-rw-r--r--src/gui/ui/processesStartDialog.ui193
-rwxr-xr-xsrc/pvs.cpp11
-rwxr-xr-xsrc/pvs.h2
23 files changed, 332 insertions, 74 deletions
diff --git a/doc/LaTeX/Makefile b/doc/LaTeX/Makefile
new file mode 100644
index 0000000..a3ecaf2
--- /dev/null
+++ b/doc/LaTeX/Makefile
@@ -0,0 +1,20 @@
+GENERATED_EPS_IMAGES = $(addsuffix .eps,$(basename $(shell echo bilder/*.dia)))
+GENERATED_PDF_IMAGES = $(addsuffix .pdf,$(basename $(GENERATED_EPS_IMAGES)))
+
+build: $(GENERATED_PDF_IMAGES)
+ pdflatex pvs-doc
+ pdflatex pvs-doc
+ makeindex pvs-doc
+ pdflatex pvs-doc
+.PHONY: build
+
+clean:
+ rm -f $(GENERATED_PDF_IMAGES) $(GENERATED_EPS_IMAGES)
+ rm -f pvs-doc.aux pvs-doc.idx pvs-doc.ilg pvs-doc.ing pvs-doc.log pvs-doc.out pvs-doc.pdf pvs-doc.toc
+.PHONY: clean
+
+%.eps : %.dia
+ dia -e $@ $<
+
+%.pdf : %.eps
+ epstopdf --outfile=$@ $<
diff --git a/doc/LaTeX/bilder/FictionalPolicyChainClassDiagram.dia b/doc/LaTeX/bilder/FictionalPolicyChainClassDiagram.dia
new file mode 100644
index 0000000..620a9d1
--- /dev/null
+++ b/doc/LaTeX/bilder/FictionalPolicyChainClassDiagram.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/ImplementedPolicies.dia b/doc/LaTeX/bilder/ImplementedPolicies.dia
new file mode 100644
index 0000000..97ab5e8
--- /dev/null
+++ b/doc/LaTeX/bilder/ImplementedPolicies.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/InputEventHandlerChain-Sequence.dia b/doc/LaTeX/bilder/InputEventHandlerChain-Sequence.dia
new file mode 100644
index 0000000..73a789a
--- /dev/null
+++ b/doc/LaTeX/bilder/InputEventHandlerChain-Sequence.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/InputEventHandlerClassDiagram.dia b/doc/LaTeX/bilder/InputEventHandlerClassDiagram.dia
new file mode 100644
index 0000000..dd8b3a0
--- /dev/null
+++ b/doc/LaTeX/bilder/InputEventHandlerClassDiagram.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/PVSPrivInputDArchitecture.dia b/doc/LaTeX/bilder/PVSPrivInputDArchitecture.dia
new file mode 100644
index 0000000..4278ba7
--- /dev/null
+++ b/doc/LaTeX/bilder/PVSPrivInputDArchitecture.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/PhasesOfKeyboardHandling.dia b/doc/LaTeX/bilder/PhasesOfKeyboardHandling.dia
new file mode 100644
index 0000000..9250e0b
--- /dev/null
+++ b/doc/LaTeX/bilder/PhasesOfKeyboardHandling.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/PolicyChainClassDiagram.dia b/doc/LaTeX/bilder/PolicyChainClassDiagram.dia
new file mode 100644
index 0000000..3a311f5
--- /dev/null
+++ b/doc/LaTeX/bilder/PolicyChainClassDiagram.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/SayHelloHandler-PolicyHier.dia b/doc/LaTeX/bilder/SayHelloHandler-PolicyHier.dia
new file mode 100644
index 0000000..341ff41
--- /dev/null
+++ b/doc/LaTeX/bilder/SayHelloHandler-PolicyHier.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/UebertragungsEbenen.dia b/doc/LaTeX/bilder/UebertragungsEbenen.dia
new file mode 100644
index 0000000..5ae4edb
--- /dev/null
+++ b/doc/LaTeX/bilder/UebertragungsEbenen.dia
Binary files differ
diff --git a/doc/LaTeX/bilder/processlist.png b/doc/LaTeX/bilder/processlist.png
index 20074ee..c2e09af 100644
--- a/doc/LaTeX/bilder/processlist.png
+++ b/doc/LaTeX/bilder/processlist.png
Binary files differ
diff --git a/doc/LaTeX/bilder/runprocess.png b/doc/LaTeX/bilder/runprocess.png
new file mode 100644
index 0000000..7b2f6bd
--- /dev/null
+++ b/doc/LaTeX/bilder/runprocess.png
Binary files differ
diff --git a/doc/LaTeX/devel/0300-pvs.tex b/doc/LaTeX/devel/0300-pvs.tex
index 66783f9..54fedd4 100644
--- a/doc/LaTeX/devel/0300-pvs.tex
+++ b/doc/LaTeX/devel/0300-pvs.tex
@@ -400,18 +400,35 @@ 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.\\
+Es ist möglich, dass der Dozent sich eine Liste von Prozessen, die er nutzen möchte erstellt und im PVSManager abspeichert, dies geht über den Prozesse starten-Dialog, er zeigt eine Liste an, die die beliebig erweiterbar ist. Einmal getätigte Änderungen werden in der Datei \textit{pvsmgr.conf} abgespeichert. Die Konfigurationsdatei ist nach folgendem Beispiel aufgebaut:
+\begin{verbatim}
+[RemoteProcessesList]
+size=2
+1\command=oowriter
+1\description=OpenOffice Writer
+2\command=oocalc
+2\description=OpenOffice Calc
+\end{verbatim}
+Hier ist zu beachten, dass size mit 1 beginnt.\\
\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:\\
-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.
+Hier sendet der Manager dem Client ein PVSCOMMAND mit Ident SHOWPROCESSES, der Inhalt der Nachricht gibt Prozesse an die herausgefiltert werden sollen. 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 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.\\
+Prozesse die aus der Liste herausgefiltert werden werden auch in der Datei \textit{pvsmgr.conf} abgespeichert. Eine mögliche Konfigurationsdatei sieht etwa so aus:
+\begin{verbatim}
+[RemoteProcessesList]
+filter=pvs pvsgui pvsmgr
+\end{verbatim}
\section{Netzwerkkommunikation}
\index{Netzwerkkommunikation}
@@ -443,7 +460,7 @@ 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\\
+PVSCOMMAND & SHOWPROCESSES & filter & weist den Client an seine Prozesse auszulesen und den Prozessvektor zu füllen, filter ist eine Nachricht der Art 'Prozess1 Prozess2 Prozess3', wobei die Prozesse Prozess1, Prozess2 und Prozess3 aus der Liste der laufenden Prozesse ausgeblendet werden\\
PVSLOGIN & USERNAME & username & Client Benutzername \\
PVSLOGIN & PASSWORD & password & Serverpasswort \\
PVSLOGIN & ID & id & \\
@@ -456,8 +473,6 @@ PVSCOMMAND & VNC & NO & Verbiete Zugriff \\
PVSCOMMAND & PING & & \\
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}
@@ -470,6 +485,8 @@ PVSCOMMAND & MCASTFTRETRY & sender transferID & Rückmeldung: Konfiguration des
\label{pvs-msg-liste}
Nachrichtentyp & Nachrichten Ident & Inhalt & Beschreibung \\
\hline
+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 \\
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 \\
diff --git a/doc/LaTeX/intro/0000-chapter.tex b/doc/LaTeX/intro/0000-chapter.tex
index c3c5efe..6b3319b 100644
--- a/doc/LaTeX/intro/0000-chapter.tex
+++ b/doc/LaTeX/intro/0000-chapter.tex
@@ -2,13 +2,13 @@
\label{einleitung}
\index{Einleitung} \index{Video Switch} \index{Laptop} \index{VGA} \index{DVI} \index{Klassenraum} \index{Student Control Panel} \index{Idee}
-Video-Switches für Klassenräume sind schon seit langem auf dem Markt: Sie setzen typischerweise auf eine Hardware-Lösung, die das Verlegen von vielen Metern Kabel bei dadurch erzwungener statischer Anordnung der Rechner verlangt. Sie sind nicht nur aufgrund des Einsatzes spezieller Hardware relativ teuer, sondern unflexibel bei technischen Weiterentwicklungen: Höhere Bildschirmauflösungen oder der Wechsel vom VGA- auf den DVI-Connector bzw. Display-Port oder die Ablösung von PS2 durch USB sind nur durch einen Komplettaustausch oder unangenehme Kompromisse zu haben. Ziemlich ungeeignet erweisen sich hardware-basierte Lösungen beim Einsatz mobiler Geräte wie Laptops. Generell erschweren sie die Veränderung der ursprünglichen Aufstellung der Maschinen und schaffen damit ungünstige Bedingungen für neue didaktische Konzepte.
+Video-Switches für Klassenräume sind schon seit langem auf dem Markt: Sie setzen typischerweise auf eine Hardware-Lösung, die das Verlegen von vielen Metern Kabel bei dadurch erzwungener statischer Anordnung der Rechner verlangt. Sie sind nicht nur aufgrund des Einsatzes spezieller Hardware relativ teuer, sondern unflexibel bei technischen Weiterentwicklungen: Höhere Bildschirmauflösungen oder der Wechsel vom VGA auf den DVI oder PS2 auf den USB-Stecker sind nur durch einen Komplettaustausch oder unangenehme Kompromisse zu haben. Ziemlich ungeeignet erweisen sich hardware-basierte Lösungen beim Einsatz mobiler Geräte wie Laptops. Zudem erschweren sie die Veränderung der ursprünglichen Aufstellung der Maschinen und schaffen damit ungünstige Bedingungen für neue didaktische Konzepte.
\begin{figure}[h]
\center
\includegraphics[width=11.5cm]{bilder/studentctlpanel.png}
\caption{Student Control Panel des Edubuntu-Pakets, welches im Umfeld von Linux-Terminalservern eingesetzt werden kann.\label{uscp}}
\end{figure}
-Neben den Hardware-basierten Varianten existieren inzwischen eine Reihe von Software-Produkten. Leider bieten sie keine optimalen Lösungen: Neben typischerweise exorbitanten Lizenzkosten, die oft mit einem didaktisch und konzeptionell fragwürdigen Feature-Set begründet werden, orientieren sie sich an einem einzigen auf den Schulungs-PCs festinstalliertem Betriebssystem. Oft stehen die Produkte nur für ausgewählte Microsoft-Betriebssysteme zur Verfügung und können damit nicht dem Anspruch einer breit angelegten Umgebung entsprechen, wie sie in Universitäten, Bildungseinrichtungen aber auch durchaus in Schulen vorzufinden ist. Zudem kommen regelmäßige, typischerweise kostenpflichtige Produkt-Updates hinzu, denen sich nur begrenzt ausweichen läßt.
+Neben den Hardware-basierten Varianten existieren inzwischen eine Reihe von Software-Produkten. Leider bieten sie keine optimalen Lösungen: Neben oft exorbitanten Lizenzkosten, die oft mit einem didaktisch und konzeptionell fragwürdigen Feature-Set begründet werden, orientieren sie sich an einem einzigen auf den Schulungs-PCs festinstalliertem Betriebssystem. Oft stehen sie nur für ausgewählte Microsoft-Betriebssysteme zur Verfügung und können damit nicht dem Anspruch einer breiten und allgemeinen universitären Umgebung entsprechen. Zudem kommen regelmäßige, typischerweise kostenpflichtige Produkt-Updates hinzu, denen sich nur begrenzt ausweichen läßt.
Dem soll ein eigener Ansatz entgegengesetzt werden, der die eingangs genannten Beschränkungen aufhebt und dem Anspruch einer modernen universitären computer-gestützten Lehre entgegenkommt. Das Projekt soll stufenweise von einer einfachen Basislösung in Rückmeldung mit den Lehrenden weiterentwickelt werden. Ein Open-Source-Ansatz gewährleistet zudem eine größere Nachhaltigkeit. Selbst bei einer Projekteinstellung können andere auf den Code weiterhin zurückgreifen und damit einerseits bestehende Installationen aktualisieren und andererseits eigene Entwicklungen schneller vorantreiben.
diff --git a/doc/LaTeX/intro/0100-funktionen.tex b/doc/LaTeX/intro/0100-funktionen.tex
index da6179b..966a065 100644
--- a/doc/LaTeX/intro/0100-funktionen.tex
+++ b/doc/LaTeX/intro/0100-funktionen.tex
@@ -10,7 +10,7 @@ In der verfügbaren Version wurden eine Reihe von Features realisiert. Hierzu zÃ
\begin{figure}[h]
\center
\includegraphics[width=11.5cm]{bilder/studentctlpanel.png}
-\caption{Die Steuerkonsole des Pool Video Switches in ihrer Hauptansicht. Diese grafische Applikation sollte sinnvollerweise auf einem eigenen Desktop oder komplett eigenen Rechner laufen.\label{uscp}}
+\caption{Student Control Panel des Edubuntu-Pakets, welches im Umfeld von Linux-Terminalservern eingesetzt werden kann.\label{uscp}}
\end{figure}
Bei der Realisierung wurde einerseits auf die Absicherung der Steuerverbindungen und andererseits auf die Aspekte des Datenschutzes geachtet. Anders als bei vergleichbaren Produkten liegt in der Standardinstallation die Kontrolle bei den Teilnehmern.
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/processWidget.cpp b/src/gui/processWidget.cpp
index 38dd2ae..df865a4 100644
--- a/src/gui/processWidget.cpp
+++ b/src/gui/processWidget.cpp
@@ -23,7 +23,16 @@ ProcessWidget::ProcessWidget(QWidget *parent, PVSClient *cl):
QWidget(parent),
prowui(new Ui::ProcessWidget)
{
+
+
prowui->setupUi(this);
+ filter = filterSettings.value("RemoteProcessesList/filter").toString();
+
+ if (filter == "")
+ {
+ filterSettings.setValue("RemoteProcessesList/filter", "pvs pvsgui x11vnc dbus-launch dbus-daemon");
+ filter = "pvs pvsgui x11vnc dbus-launch dbus-daemon";
+ }
client = cl;
@@ -33,7 +42,7 @@ ProcessWidget::ProcessWidget(QWidget *parent, PVSClient *cl):
connect( client, SIGNAL( processVectorReady(bool)), this, SLOT( refrProcessList()));
//tell client we want to see his processes
- sendCommand("SHOWPROCESSES", "");
+ sendCommand("SHOWPROCESSES", filter);
}
void ProcessWidget::startProcess()
@@ -46,14 +55,14 @@ void ProcessWidget::startProcess()
if (start == QMessageBox::Ok)
{
sendCommand("STARTPROCESS", prowui->processLineEdit->text());
- sendCommand("SHOWPROCESSES", "");
+ sendCommand("SHOWPROCESSES", filter);
}
prowui->processLineEdit->clear();
}
void ProcessWidget::resendProcessList()
{
- sendCommand("SHOWPROCESSES", "");
+ sendCommand("SHOWPROCESSES", filter);
}
void ProcessWidget::refrProcessList(bool timerEvent)
@@ -127,7 +136,7 @@ void ProcessWidget::stopProcess()
}
}
//tell client to update his list
- sendCommand("SHOWPROCESSES", "");
+ sendCommand("SHOWPROCESSES", filter);
}
}
diff --git a/src/gui/processWidget.h b/src/gui/processWidget.h
index 4d696eb..7f6737c 100644
--- a/src/gui/processWidget.h
+++ b/src/gui/processWidget.h
@@ -25,6 +25,8 @@ private:
Ui::ProcessWidget *prowui;
PVSClient *client;
QVector<QString> *processes;
+ QSettings filterSettings;
+ QString filter;
private slots:
void startProcess();
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 @@
<rect>
<x>0</x>
<y>0</y>
- <width>418</width>
- <height>120</height>
+ <width>524</width>
+ <height>309</height>
</rect>
</property>
<property name="windowTitle">
<string>Start Process</string>
</property>
- <widget class="QWidget" name="layoutWidget">
+ <widget class="QWidget" name="verticalLayoutWidget_3">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
- <width>401</width>
- <height>101</height>
+ <width>503</width>
+ <height>291</height>
</rect>
</property>
- <layout class="QVBoxLayout" name="verticalLayout">
+ <layout class="QVBoxLayout" name="outerVerticalLayout">
<item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Process to start:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="message"/>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>5</number>
- </property>
+ <layout class="QVBoxLayout" name="upperVerticalLayout">
<item>
- <widget class="QPushButton" name="listOfProcessesButton">
+ <widget class="QLabel" name="label_2">
<property name="text">
- <string>List of Processes</string>
+ <string>Either use a command from this list or type in the process in the lower field.</string>
</property>
</widget>
</item>
<item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+ <widget class="QTableWidget" name="processesList">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="editTriggers">
+ <set>QAbstractItemView::DoubleClicked|QAbstractItemView::SelectedClicked</set>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ <property name="gridStyle">
+ <enum>Qt::DotLine</enum>
+ </property>
+ <property name="sortingEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>108</width>
- <height>20</height>
- </size>
+ <property name="cornerButtonEnabled">
+ <bool>false</bool>
</property>
- </spacer>
+ <attribute name="horizontalHeaderVisible">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="horizontalHeaderCascadingSectionResizes">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderDefaultSectionSize">
+ <number>200</number>
+ </attribute>
+ <attribute name="horizontalHeaderHighlightSections">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="verticalHeaderVisible">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderStretchLastSection">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="horizontalHeaderCascadingSectionResizes">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderVisible">
+ <bool>true</bool>
+ </attribute>
+ <attribute name="horizontalHeaderHighlightSections">
+ <bool>false</bool>
+ </attribute>
+ <attribute name="horizontalHeaderDefaultSectionSize">
+ <number>200</number>
+ </attribute>
+ <column>
+ <property name="text">
+ <string>Command</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <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>
+ <widget class="QPushButton" name="saveButton">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="lowerVerticalLayout">
<item>
- <widget class="QPushButton" name="cancelButton">
+ <widget class="QLabel" name="label">
<property name="text">
- <string>Cancel</string>
+ <string>Process to start:</string>
</property>
</widget>
</item>
<item>
- <widget class="QPushButton" name="sendButton">
- <property name="text">
- <string>Start</string>
+ <widget class="QLineEdit" name="message"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>5</number>
</property>
- </widget>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>108</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="sendButton">
+ <property name="text">
+ <string>Start</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</item>
diff --git a/src/pvs.cpp b/src/pvs.cpp
index 843a725..1f751b8 100755
--- a/src/pvs.cpp
+++ b/src/pvs.cpp
@@ -263,7 +263,7 @@ void PVS::onCommand(PVSMsg cmdMessage)
if (ident.compare("SHOWPROCESSES") == 0)
{
_pvsServerConnection->sendMessage(PVSMsg(PVSCOMMAND, "PROCESSES", "SHOW clear")); //tell the client that we want to clear his process-list
- showProc();
+ showProc(message);
return;
}
if (ident.compare("STARTPROCESS") == 0)
@@ -938,10 +938,9 @@ QString PVS::getConfigValue(QString key)
return _settings.value(key).toString();
}
-void PVS::showProc()
+void PVS::showProc(QString filter)
{
- QString settings = getConfigValue("RemoteProcess/filter");
- QStringList filter = settings.split(" ");
+ QStringList filterList = filter.split(" ");
//look at procfs
QDir procfs("/proc");
@@ -988,9 +987,9 @@ void PVS::showProc()
}
if (write) //check if user belongs to pvs
{
- for (int i=0;i<filter.size();i++)
+ for (int i=0;i<filterList.size();i++)
{
- if (name == (filter.at(i)))
+ if (name == (filterList.at(i)))
write = false;
}
}
diff --git a/src/pvs.h b/src/pvs.h
index e3ff329..49c2b4c 100755
--- a/src/pvs.h
+++ b/src/pvs.h
@@ -159,7 +159,7 @@ private:
int stopVNCScript(); ///< stop the vnc server (via script)
static void signalHandler(int signal); //handles posix signals
- void showProc(); //sends list of user processes to connection manager
+ void showProc(QString filter); //sends list of user processes to connection manager
PVSServerConnection* _pvsServerConnection; ///< our tcp connection object to the pvsserver