The branch, master has been updated via 200237d292c6ba89aa1de1fa0c4da35c96febf63 (commit) from dee1323652c6922b5154871b2fe83f7fa99a7f97 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 200237d292c6ba89aa1de1fa0c4da35c96febf63 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Thu Jan 24 16:34:16 2013 +0100 add session administration module ----------------------------------------------------------------------- Summary of changes: debian/changelog | 1 + .../modules/x2gosessionadmingui/png/node.png | Bin 0 -> 2408 bytes .../modules/x2gosessionadmingui/png/server.png | Bin 0 -> 6602 bytes .../x2gosessionadmingui/png/x2gosession.png | Bin 0 -> 1882 bytes .../modules/x2gosessionadmingui/sessionadmin.rcc | 8 + .../x2gosessionadmingui.pro} | 16 +- .../x2gosessionadmingui/x2gosessionadmingui_de.ts | 155 ++++++++++ .../x2gosessionadmingui/x2gosessionadminui.ui | 186 ++++++++++++ .../x2gosessionadmingui/x2gosessionadminwindow.cpp | 321 ++++++++++++++++++++ .../x2gosessionadminwindow.h} | 79 ++--- x2goadminserver/cgi-bin/x2gorpcserver.cgi | 3 + x2goadminserver/etc/x2goadminserver.conf | 12 +- x2goadminserver/lib/x2goadminserver.pm | 19 +- .../lib/x2goadminserver_backend_ldap.pm | 74 ++++- 14 files changed, 809 insertions(+), 65 deletions(-) create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/png/node.png create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/png/server.png create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/png/x2gosession.png create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/sessionadmin.rcc copy x2goadmincenter/modules/{x2gouseradmingui/x2gouseradmingui.pro => x2gosessionadmingui/x2gosessionadmingui.pro} (63%) create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui_de.ts create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminui.ui create mode 100644 x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.cpp copy x2goadmincenter/modules/{x2gogroupadmingui/x2gogroupadminwindow.h => x2gosessionadmingui/x2gosessionadminwindow.h} (54%) The diff of changes is: diff --git a/debian/changelog b/debian/changelog index 2925226..ec55419 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,5 +13,6 @@ x2goadmincenter (0.0.0.1-0~x2go1) UNRELEASED; urgency=low ldap backend for x2goadminserver * fixed setting password by user creation * execute /etc/x2go/adduser after user creation (if file executable) + * add session administration module -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Wed, 21 Sep 2011 21:12:56 +0200 diff --git a/x2goadmincenter/modules/x2gosessionadmingui/png/node.png b/x2goadmincenter/modules/x2gosessionadmingui/png/node.png new file mode 100644 index 0000000..0d65365 Binary files /dev/null and b/x2goadmincenter/modules/x2gosessionadmingui/png/node.png differ diff --git a/x2goadmincenter/modules/x2gosessionadmingui/png/server.png b/x2goadmincenter/modules/x2gosessionadmingui/png/server.png new file mode 100644 index 0000000..ee80334 Binary files /dev/null and b/x2goadmincenter/modules/x2gosessionadmingui/png/server.png differ diff --git a/x2goadmincenter/modules/x2gosessionadmingui/png/x2gosession.png b/x2goadmincenter/modules/x2gosessionadmingui/png/x2gosession.png new file mode 100644 index 0000000..0ec90b2 Binary files /dev/null and b/x2goadmincenter/modules/x2gosessionadmingui/png/x2gosession.png differ diff --git a/x2goadmincenter/modules/x2gosessionadmingui/sessionadmin.rcc b/x2goadmincenter/modules/x2gosessionadmingui/sessionadmin.rcc new file mode 100644 index 0000000..0be321b --- /dev/null +++ b/x2goadmincenter/modules/x2gosessionadmingui/sessionadmin.rcc @@ -0,0 +1,8 @@ +<RCC> + <qresource> + <file>png/node.png</file> + <file>png/server.png</file> + <file>png/x2gosession.png</file> + <file>qt_de.qm</file> + </qresource> +</RCC> diff --git a/x2goadmincenter/modules/x2gouseradmingui/x2gouseradmingui.pro b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui.pro similarity index 63% copy from x2goadmincenter/modules/x2gouseradmingui/x2gouseradmingui.pro copy to x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui.pro index b766b09..6447bfa 100644 --- a/x2goadmincenter/modules/x2gouseradmingui/x2gouseradmingui.pro +++ b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui.pro @@ -2,19 +2,23 @@ # Automatically generated by qmake (2.01a) Mi. Feb 2 11:39:02 2011 ###################################################################### -TRANSLATIONS += x2gouseradmingui_de.ts - TEMPLATE = lib TARGET = DEPENDPATH += . INCLUDEPATH += . INCLUDEPATH += ../.. -RESOURCES += resources.rcc +RESOURCES += sessionadmin.rcc CONFIG += plugin DESTDIR= ../../plugins/ include(../../maia/maia.pri) +TRANSLATIONS += x2gosessionadmingui_de.ts + # Input -HEADERS += x2gouseradminwindow.h -FORMS += x2gouseradminui.ui -SOURCES += x2gouseradminwindow.cpp +HEADERS += x2gosessionadminwindow.h +FORMS += x2gosessionadminui.ui +SOURCES += x2gosessionadminwindow.cpp + +win32-* { +CONFIG += static +} diff --git a/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui_de.ts b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui_de.ts new file mode 100644 index 0000000..c0b84a5 --- /dev/null +++ b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadmingui_de.ts @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="de_DE"> +<context> + <name>MaiaObject</name> + <message> + <location filename="../../maia/maiaObject.cpp" line="287"/> + <source>parse error: invalid xml-rpc. not conforming to spec.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>X2GoSessionAdminUI</name> + <message> + <location filename="x2gosessionadminui.ui" line="14"/> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="51"/> + <source>User</source> + <translation>Benutzer</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="56"/> + <source>State</source> + <translation>Status</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="61"/> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="66"/> + <source>Start time</source> + <translation>Gestartet</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="71"/> + <source>Display</source> + <translation>Display</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="76"/> + <source>Client IP</source> + <translation>Client IP</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="81"/> + <source>Interrupted at</source> + <translation>Unterbrochen</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="86"/> + <source>ID</source> + <translation>ID</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="96"/> + <source>Suspend</source> + <translation>Unetrbrechen</translation> + </message> + <message> + <location filename="x2gosessionadminui.ui" line="103"/> + <source>Terminate</source> + <translation>Beenden</translation> + </message> +</context> +<context> + <name>X2GoSessionAdminWindow</name> + <message> + <location filename="x2gosessionadminwindow.cpp" line="63"/> + <source>X2Go session administration</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="64"/> + <source>Use this module to administrate X2Go sessions</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="73"/> + <source>Developers:</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="74"/> + <source>Translators:</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="126"/> + <location filename="x2gosessionadminwindow.cpp" line="140"/> + <location filename="x2gosessionadminwindow.cpp" line="165"/> + <source>Retrieving information from server, please wait...</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="180"/> + <location filename="x2gosessionadminwindow.cpp" line="217"/> + <source>Running</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="185"/> + <location filename="x2gosessionadminwindow.cpp" line="215"/> + <source>Suspended</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="202"/> + <source>Ready</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="219"/> + <source>Finished</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="277"/> + <source>Connection error</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="288"/> + <source>Server connection failed<br>Error message:</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="289"/> + <location filename="x2gosessionadminwindow.cpp" line="297"/> + <location filename="x2gosessionadminwindow.cpp" line="305"/> + <location filename="x2gosessionadminwindow.cpp" line="313"/> + <source>Server error</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="296"/> + <source>Login failed</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="304"/> + <source>Execution of command failed<br>Error message:</source> + <translation></translation> + </message> + <message> + <location filename="x2gosessionadminwindow.cpp" line="312"/> + <source>Database error<br>Error message:</source> + <translation></translation> + </message> +</context> +</TS> diff --git a/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminui.ui b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminui.ui new file mode 100644 index 0000000..5239dd3 --- /dev/null +++ b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminui.ui @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>X2GoSessionAdminUI</class> + <widget class="QWidget" name="X2GoSessionAdminUI"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>931</width> + <height>545</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTreeWidget" name="treeServers"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <column> + <property name="text"> + <string>User</string> + </property> + </column> + <column> + <property name="text"> + <string>State</string> + </property> + </column> + <column> + <property name="text"> + <string>Server</string> + </property> + </column> + <column> + <property name="text"> + <string>Start time</string> + </property> + </column> + <column> + <property name="text"> + <string>Display</string> + </property> + </column> + <column> + <property name="text"> + <string>Client IP</string> + </property> + </column> + <column> + <property name="text"> + <string>Interrupted at</string> + </property> + </column> + <column> + <property name="text"> + <string>ID</string> + </property> + </column> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="pbSuspend"> + <property name="text"> + <string>Suspend</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbTerminate"> + <property name="text"> + <string>Terminate</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>treeServers</sender> + <signal>itemActivated(QTreeWidgetItem*,int)</signal> + <receiver>X2GoSessionAdminUI</receiver> + <slot>slotSelectSession(QTreeWidgetItem*,int)</slot> + <hints> + <hint type="sourcelabel"> + <x>652</x> + <y>156</y> + </hint> + <hint type="destinationlabel"> + <x>927</x> + <y>523</y> + </hint> + </hints> + </connection> + <connection> + <sender>pbSuspend</sender> + <signal>clicked()</signal> + <receiver>X2GoSessionAdminUI</receiver> + <slot>slotSuspend()</slot> + <hints> + <hint type="sourcelabel"> + <x>58</x> + <y>523</y> + </hint> + <hint type="destinationlabel"> + <x>2</x> + <y>458</y> + </hint> + </hints> + </connection> + <connection> + <sender>pbTerminate</sender> + <signal>clicked()</signal> + <receiver>X2GoSessionAdminUI</receiver> + <slot>slotTerminate()</slot> + <hints> + <hint type="sourcelabel"> + <x>165</x> + <y>520</y> + </hint> + <hint type="destinationlabel"> + <x>0</x> + <y>370</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>slotApply()</slot> + <slot>slotDeleteGroups()</slot> + <slot>slotItemChanged(QTreeWidgetItem*,int)</slot> + <slot>slotTreeRequestMenu(QPoint)</slot> + <slot>slotServerChanged()</slot> + <slot>slotDiscard()</slot> + <slot>slotSelectSession(QTreeWidgetItem*,int)</slot> + <slot>slotSuspend()</slot> + <slot>slotTerminate()</slot> + </slots> +</ui> diff --git a/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.cpp b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.cpp new file mode 100644 index 0000000..5a9821a --- /dev/null +++ b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.cpp @@ -0,0 +1,321 @@ +/* + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 2011 Oleksandr Shneyder<oleksandr.shneyder@obviously-nice.de> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "x2gosessionadminwindow.h" +#include <QTimer> +#include <QPixmap> +#include <QInputDialog> +#include <QDebug> +#include <QMessageBox> +#include <centerinterface.h> +#include <QMenu> +#include <QHeaderView> + +void X2GoSessionAdminWindow::installTranslator() +{ + QTranslator* trans=new QTranslator(); + QString filename=QString ( ":/x2gosessionadmingui_%1" ).arg ( + QLocale::system().name() ); + filename=filename.toLower(); + if ( !trans->load ( filename ) ) + { + qDebug ( "Can't load translator (%s) !\n", + filename.toLocal8Bit().data() ); + } + else + { + QCoreApplication::installTranslator ( trans ); + } + + + QTranslator* qtTranslator=new QTranslator; + filename=QString ( ":/qt_%1" ).arg ( QLocale::system().name() ); + if ( !qtTranslator->load ( filename ) ) + { + qDebug()<< "Can't load translator "<< + filename.toLocal8Bit().data() ; + } + else + { + QCoreApplication::installTranslator ( qtTranslator ); + } +} + +X2GoSessionAdminWindow::X2GoSessionAdminWindow() +{ + installTranslator(); + NAME =tr("X2Go session administration"); + DESCRIPTION= tr("Use this module to administrate X2Go sessions"); + + DEVELOPERS= "Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de><br>" + "Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de>"; + + TRANSLATORS ="Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de>"; + + ABOUT= "<b>"+NAME + "-" + VERSION + "</b><br><br>" + +DESCRIPTION+"<br><br><b>" + + tr("Developers:")+"</b><br>" + DEVELOPERS+ "<br><br><b>" + + tr("Translators:")+"</b><br>"+ TRANSLATORS; + + + qDebug()<<"session admin constructor"; + hidden=true; + setupUi ( this ); + centerInstance=0l; + treeServers->setAllColumnsShowFocus ( true ); + treeServers->setAlternatingRowColors ( true ); + treeServers->setUniformRowHeights ( true ); + treeServers->setIconSize(QSize(32,32)); +} + +X2GoSessionAdminWindow::~X2GoSessionAdminWindow() +{ + +} + +void X2GoSessionAdminWindow::startPlugin() +{ + + changed=false; + hidden=false; + closing=false; + adminMode=true; + + rpc= new MaiaXmlRpcClient(QUrl(centerInstance->getUrl()),this); + + QSslConfiguration config=rpc->sslConfiguration(); + config.setProtocol(QSsl::AnyProtocol); + rpc->setSslConfiguration(config); + + connect(rpc, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, + SLOT(slotHandleSslErrors(QNetworkReply*,QList<QSslError>))); + treeServers->setRootIsDecorated(false); + treeServers->setItemsExpandable(false); + + pbSuspend->setEnabled(false); + pbTerminate->setEnabled(false); + treeServers->header()->setResizeMode ( QHeaderView::ResizeToContents ); + treeServers->header()->setSortIndicator ( 1,Qt::AscendingOrder ); + slotGetSessions(); +} + +void X2GoSessionAdminWindow::slotSuspend() +{ + servTimer.stop(); + QTreeWidgetItem* sel = treeServers->currentItem(); + QString server=sel->text(COL_SERVER); + QString id=sel->text(COL_ID); + QVariantList args; + args<<centerInstance->getLogin()<<centerInstance->getPassword()<<server<<id; + centerInstance->setStatus(tr("Retrieving information from server, please wait...")); + rpc->call("x2goadmin.suspendSession",args, this, SLOT(slotSessionsList(QVariant&)), + this, SLOT(slotRpcFault(int, const QString&))); + +} + +void X2GoSessionAdminWindow::slotTerminate() +{ + servTimer.stop(); + QTreeWidgetItem* sel = treeServers->currentItem(); + QString server=sel->text(COL_SERVER); + QString id=sel->text(COL_ID); + QVariantList args; + args<<centerInstance->getLogin()<<centerInstance->getPassword()<<server<<id; + centerInstance->setStatus(tr("Retrieving information from server, please wait...")); + rpc->call("x2goadmin.terminateSession",args, this, SLOT(slotSessionsList(QVariant&)), + this, SLOT(slotRpcFault(int, const QString&))); + +} + +void X2GoSessionAdminWindow::slotRetControl(QVariant& result) +{ + if (hidden) + return; + QString res=result.toString(); + qDebug()<<res; + if (!checkResult(res)) + { + centerInstance->backToList(); + return; + } +} + +void X2GoSessionAdminWindow::slotGetSessions() +{ + QVariantList args; + args<<centerInstance->getLogin()<<centerInstance->getPassword(); + rpc->call("x2goadmin.getSessions",args, this, SLOT(slotSessionsList(QVariant&)), + this, SLOT(slotRpcFault(int, const QString&))); + centerInstance->setStatus(tr("Retrieving information from server, please wait...")); + changed=false; +} + + +void X2GoSessionAdminWindow::slotSelectSession(QTreeWidgetItem* item, int ) +{ + pbSuspend->setEnabled(false); + pbTerminate->setEnabled(false); + if(!item) + { + selectedSession=QString::null; + return; + } + selectedSession=item->text(COL_ID); + if(item->text(COL_STATE)==tr("Running")) + { + pbSuspend->setEnabled(true); + pbTerminate->setEnabled(true); + } + if(item->text(COL_STATE)==tr("Suspended")) + { + pbTerminate->setEnabled(true); + } +} + + +void X2GoSessionAdminWindow::slotSessionsList(QVariant& result) +{ + if (hidden) + return; + QString res=result.toString(); + if (!checkResult(res)) + { + centerInstance->backToList(); + return; + } + centerInstance->setStatus(tr("Ready")); + + treeServers->clear(); + + QStringList sessions=result.toString().split("\n",QString::SkipEmptyParts); + QString session; + foreach(session, sessions) + { + QStringList details=session.split("|"); + QTreeWidgetItem *it=new QTreeWidgetItem(treeServers); + it->setText(COL_USER, details[7]); + QString state; + if(details[3]=="S") + state=tr("Suspended"); + if(details[3]=="R") + state=tr("Running"); + if(details[3]=="F") + state=tr("Finished"); + it->setText(COL_STATE, state); + it->setText(COL_SERVER, details[2]); + QDateTime dt=QDateTime::fromString(details[4],Qt::ISODate ); + it->setText(COL_START, dt.toString("dd.MM HH:mm")); + it->setText(COL_ID, details[0]); + it->setText(COL_DISPLAY, details[1]); + it->setText(COL_IP, details[5]); + if(details[3]=="S") + { + dt=QDateTime::fromString(details[6],Qt::ISODate ); + it->setText(COL_INTERRUPTED, dt.toString("dd.MM HH:mm")); + } + else + { + it->setText(COL_INTERRUPTED, ""); + } + if(details[0]==selectedSession) + { + it->setSelected(true); + treeServers->setCurrentItem(it); + slotSelectSession(it,0); + } + } + + changed=false; + servTimer.singleShot(5000, this, SLOT(slotGetSessions())); +} + + + +bool X2GoSessionAdminWindow::closePlugin() +{ + if (closing) + return false; + hidden=true; + return true; +} + + +void X2GoSessionAdminWindow::setCenterInstance(CenterInterface* obj) +{ + centerInstance=obj; +} + + +void X2GoSessionAdminWindow::slotHandleSslErrors(QNetworkReply* reply, const QList< QSslError >& errors) +{ + if (hidden) + return; + centerInstance->handleSslErrors(reply, errors); +} + + +void X2GoSessionAdminWindow::slotRpcFault(int, const QString& errMessage) +{ + if (hidden) + return; + QMessageBox::critical(this, tr("Connection error"), errMessage); + centerInstance->backToList(); +} + + +bool X2GoSessionAdminWindow::checkResult(const QString& result) +{ + if (result.indexOf("SERVERDOWN")==0) + { + QString res=result; + res.replace("SERVERDOWN ","" ); + QString errorMessage=tr("Server connection failed<br>Error message:")+"\n"+res; + QMessageBox::critical(this, tr("Server error"), errorMessage); + return false; + } + if (result.indexOf("NOACCESS")==0) + { + QString res=result; + res.replace("NOACCESS ","" ); + QString errorMessage=tr("Login failed"); + QMessageBox::critical(this, tr("Server error"), errorMessage); + return false; + } + if (result.indexOf("CMDERR")==0) + { + QString res=result; + res.replace("CMDERR ","" ); + QString errorMessage=tr("Execution of command failed<br>Error message:")+"\n"+res; + QMessageBox::critical(this, tr("Server error"), errorMessage); + return false; + } + if (result.indexOf("DBERR")==0) + { + QString res=result; + res.replace("DBERR ","" ); + QString errorMessage=tr("Database error<br>Error message:")+"\n"+res; + QMessageBox::critical(this, tr("Server error"), errorMessage); + return false; + } + return true; +} + + + +Q_EXPORT_PLUGIN2(x2gosessionadmin, X2GoSessionAdminWindow) diff --git a/x2goadmincenter/modules/x2gogroupadmingui/x2gogroupadminwindow.h b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.h similarity index 54% copy from x2goadmincenter/modules/x2gogroupadmingui/x2gogroupadminwindow.h copy to x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.h index 8f535ef..13c0fb5 100644 --- a/x2goadmincenter/modules/x2gogroupadmingui/x2gogroupadminwindow.h +++ b/x2goadmincenter/modules/x2gosessionadmingui/x2gosessionadminwindow.h @@ -17,40 +17,37 @@ */ -#ifndef X2GOGROUPADMINWINDOW_H -#define X2GOGROUPADMINWINDOW_H +#ifndef X2GOSERVERADMINWINDOW_H +#define X2GOSERVERADMINWINDOW_H #include <x2goadminInterface.h> -#include "ui_x2gogroupadminui.h" +#include "ui_x2gosessionadminui.h" #include <maiaXmlRpcClient.h> #include <QLocale> #define VERSION "0.0.0.1" +#define APPICON QPixmap(":/png/x2gosession.png") -#define APPICON QPixmap(":/png/x2gogroup.png") -#define GROUPATTR TYPE+1 - - -struct user { - QString login; - QString fname; - QString lname; - QString uidn; - bool operator == (const struct user& us) +struct NodeOrServer +{ + QString name,ip,desc; + bool status; + QStringList nodes; + bool operator == (const struct NodeOrServer& s) { - return (us.login==login); + return (s.name==name); } }; -class X2GoGroupAdminWindow :public QWidget, public X2goAdminPlugin, private Ui::X2GoGroupAdminUI +class X2GoSessionAdminWindow :public QWidget, public X2goAdminPlugin, private Ui::X2GoSessionAdminUI { Q_OBJECT Q_INTERFACES(X2goAdminPlugin) public: - X2GoGroupAdminWindow(); - ~X2GoGroupAdminWindow(); + X2GoSessionAdminWindow(); + ~X2GoSessionAdminWindow(); QString pluginName() { return NAME; } @@ -71,61 +68,37 @@ public: void startPlugin(); private: - void getGroups(); bool checkResult(const QString& result); - int applyQestion(); - bool stringIsAscii(const QString& str); - void initGroupAttr(const QString& attrString); - void initGroupList(const QString& res); void installTranslator(); - bool isAttributeUnic(int col, QString value); - int findFreeGid(); CenterInterface* centerInstance; MaiaXmlRpcClient* rpc; bool changed; bool hidden; bool closing; bool adminMode; - enum {GNAME, GID, DESC, PASSWORD, MEMBERS, TYPE}; - enum {COL_GNAME, COL_GID, COL_DESC, COL_TYPE}; - struct grattr - { - bool supported; - bool editable; - bool unicode; - bool oncreate; - QStringList vars; - }; - grattr groupAttributes[GROUPATTR]; - struct { - QString name,gid,desc,type,password,newpassword; - QStringList users; - QTreeWidgetItem *item; - bool newGroup; - }currentGroup; + QString selectedSession; + enum {COL_USER, COL_STATE, COL_SERVER, COL_START, COL_DISPLAY, COL_IP, COL_INTERRUPTED, COL_ID}; + QString NAME; QString DESCRIPTION; QString DEVELOPERS; QString TRANSLATORS; QString ABOUT; - + QTimer servTimer; + + private slots: + void slotGetSessions(); void slotHandleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors); void slotRpcFault(int, const QString& errMessage); - void slotGroupList(QVariant& var); - void slotApply(); - void slotGroupSelected(QTreeWidgetItem* item,int col); - void slotRemoveUsers(); - void slotAddUsers(); - void slotGroupChanged(); - void slotGroupModified(QVariant& var); - void slotChangePass(); - void slotNewGroup(); - void slotDeleteGroups(); - void slotGroupsRemoved(QVariant& result); + void slotSessionsList(QVariant& var); + void slotRetControl(QVariant& var); + void slotSelectSession(QTreeWidgetItem* item, int); + void slotSuspend(); + void slotTerminate(); }; #endif // X2GOGROUPADMINWINDOW_H diff --git a/x2goadminserver/cgi-bin/x2gorpcserver.cgi b/x2goadminserver/cgi-bin/x2gorpcserver.cgi index eb2bc8b..4afc4ea 100755 --- a/x2goadminserver/cgi-bin/x2gorpcserver.cgi +++ b/x2goadminserver/cgi-bin/x2gorpcserver.cgi @@ -27,6 +27,9 @@ use x2goadminserver; process_cgi_call({ +'x2goadmin.getSessions' => \&x2goadminserver::x2goadmin_getSessions, +'x2goadmin.suspendSession' => \&x2goadminserver::x2goadmin_suspendSession, +'x2goadmin.terminateSession' => \&x2goadminserver::x2goadmin_terminateSession, 'x2goadmin.getGroupsOfUser' => \&x2goadminserver::x2goadmin_getGroupsOfUser, 'x2goadmin.modifyUser' => \&x2goadminserver::x2goadmin_modifyUser, 'x2goadmin.modifyGroup' => \&x2goadminserver::x2goadmin_modifyGroup, diff --git a/x2goadminserver/etc/x2goadminserver.conf b/x2goadminserver/etc/x2goadminserver.conf index e7723bd..ea5e01b 100644 --- a/x2goadminserver/etc/x2goadminserver.conf +++ b/x2goadminserver/etc/x2goadminserver.conf @@ -26,6 +26,12 @@ backend=x2goldap [x2goldap] url=ldap://localhost -basedn="o=Gymnasium Bruckmuehl,c=de" -smbgroup=S-1-5-21-820157184-2864210838-2273796612-513 -sid=S-1-5-21-820157184-2864210838-2273796612 +basedn="o=org,c=de" +smbgroup=S-1-5-21-000000000-0000000000-0000000000-513 +sid=S-1-5-21-000000000-0000000000-0000000000 +dbhost=localhost +dbport=5432 +dbuser=x2godbadmin +dbpass=secret +dbname=x2go_sessions +dbssl=prefer diff --git a/x2goadminserver/lib/x2goadminserver.pm b/x2goadminserver/lib/x2goadminserver.pm index ec6ce77..2662356 100644 --- a/x2goadminserver/lib/x2goadminserver.pm +++ b/x2goadminserver/lib/x2goadminserver.pm @@ -40,7 +40,24 @@ if($backend eq "x2goldap" ) use base 'Exporter'; our @EXPORT=('x2goadmin_getUsers','x2goadmin_getGroups', 'x2goadmin_getGroupsOfUser','x2goadmin_getGroupsWithUsers', 'x2goadmin_modifyUser', 'x2goadmin_addUser','x2goadmin_modifyGroup', - 'x2goadmin_addGroup' ,'x2goadmin_removeUsers','x2goadmin_removeGroups'); + 'x2goadmin_addGroup' ,'x2goadmin_removeUsers','x2goadmin_removeGroups', + 'x2goadmin_getSessions', 'x2goadmin_suspendSession', 'x2goadmin_terminateSession'); + +print "sessions:"; +getSessions(); +print "ok"; + +sub x2goadmin_getSessions { + return getSessions(@_); +} + +sub x2goadmin_suspendSession { + return suspendSession(@_); +} + +sub x2goadmin_terminateSession { + return terminateSession(@_); +} sub x2goadmin_getUsers { diff --git a/x2goadminserver/lib/x2goadminserver_backend_ldap.pm b/x2goadminserver/lib/x2goadminserver_backend_ldap.pm index 721fabb..80379bc 100644 --- a/x2goadminserver/lib/x2goadminserver_backend_ldap.pm +++ b/x2goadminserver/lib/x2goadminserver_backend_ldap.pm @@ -21,7 +21,7 @@ package x2goadminserver_backend_ldap; use Exporter 'import'; -@EXPORT= qw(getUsers getGroups getGroupsOfUser getGroupsWithUsers modifyUser modifyGroup addUser addGroup removeUsers removeGroups); +@EXPORT= qw(getUsers getGroups getGroupsOfUser getGroupsWithUsers modifyUser modifyGroup addUser addGroup removeUsers removeGroups getSessions terminateSession suspendSession); use strict; use Config::Simple; @@ -35,6 +35,7 @@ use Unicode::Normalize; use utf8; use Frontier::RPC2; use Encode; +use DBI; my $Config = new Config::Simple(syntax=>'ini'); $Config->read('/etc/x2go/x2goadminserver.conf' ) or die "/etc/x2go/x2goadminserver.conf"; @@ -43,9 +44,78 @@ my $basedn=$Config->param("x2goldap.basedn"); my $sambagroup=$Config->param("x2goldap.smbgroup"); my $sid=$Config->param("x2goldap.sid"); +my $dbname=$Config->param("x2goldap.dbname"); +my $dbhost=$Config->param("x2goldap.dbhost"); +my $dbport=$Config->param("x2goldap.dbport"); +my $dbuser=$Config->param("x2goldap.dbuser"); +my $dbpass=$Config->param("x2goldap.dbpass"); +my $dbssl=$Config->param("x2goldap.dbssl"); + my $ldap; +sub terminateSession +{ + my ($login, $password, $server, $id)=@_; + my $retmsg="OK"; + + my ($status,$str)=getServerInfo($login, $password); + if(!$status) + { + return $str; + } + system("/etc/x2go/controlsession terminate $server $id"); + return getSessions($login, $password); +} + +sub suspendSession +{ + my ($login, $password, $server, $id)=@_; + my $retmsg="OK"; + + my ($status,$str)=getServerInfo($login, $password); + if(!$status) + { + return $str; + } + system("/etc/x2go/controlsession suspend $server $id"); + return getSessions($login, $password); +} + +sub getSessions +{ + my ($login, $password, @args)=@_; + my $retmsg="OK"; + + my ($status,$str)=getServerInfo($login, $password); + if(!$status) + { + return $str; + } + my $dbh=DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport;sslmode=$dbssl", + "$dbuser", "$dbpass",{AutoCommit => 1}) or return ("DBERR ".$DBI::errstr); + + my @strings; + my $sth=$dbh->prepare("select session_id, display, server, status, + to_char(init_time,'YYYY-MM-DDThh24:MI:SS'), client, + to_char(last_time,'YYYY-MM-DDThh24:MI:SS'), uname from sessions"); + $sth->execute() or return ("DBERR ".$DBI::errstr); + my @data; + my $i=0; + while (@data = $sth->fetchrow_array) + { + my ($code, $msg, $cn, $sn)=getUserName("uid=@data[7],ou=People,$basedn"); + if($code) + { + return ("CMDERR "." ".$msg); + } + @data[7]=@data[7]."($cn $sn)"; + @strings[$i++]=join('|',@data); + } + $sth->finish(); + $dbh->disconnect(); + return join("\n",@strings); +} sub normalized @@ -73,7 +143,7 @@ sub getUserName my $message=$ldap->search(base => $dn, scope => 'base', filter => '(objectClass=posixAccount)'); if($message->code) { - return ($message->code,$message->error_desc, $cn, $sn); + return ($message->code,$message->error_desc." ".$dn, $cn, $sn); } foreach ($message->entries) { hooks/post-receive -- x2goadmincenter.git (X2Go Administration Center) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "x2goadmincenter.git" (X2Go Administration Center).