[X2go-Commits] x2goadmincenter.git - master (branch) updated: 200237d292c6ba89aa1de1fa0c4da35c96febf63

X2Go dev team git-admin at x2go.org
Thu Jan 24 16:39:51 CET 2013


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 at 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 at 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 at 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 at obviously-nice.de><br>"
+                "Heinz-Markus Graesing <heinz-m.graesing at obviously-nice.de>";
+
+    TRANSLATORS ="Heinz-Markus Graesing <heinz-m.graesing at 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';
- at EXPORT= qw(getUsers getGroups getGroupsOfUser getGroupsWithUsers modifyUser modifyGroup addUser addGroup removeUsers removeGroups);
+ at 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('|', at data);
+  }
+  $sth->finish();
+  $dbh->disconnect();
+  return join("\n", at 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).




More information about the x2go-commits mailing list