[X2Go-Commits] [x2goserver] 02/02: X2Go/Server/DB: add new file MySQL.pm, implementing the MySQL session storage backend.
git-admin at x2go.org
git-admin at x2go.org
Sat Feb 24 23:24:00 CET 2018
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch feature/mysql-backend
in repository x2goserver.
commit 73c2770b675561c217ba83342e75faf4494c4c80
Author: Mihai Moldovan <ionic at ionic.de>
Date: Sat Feb 24 23:23:34 2018 +0100
X2Go/Server/DB: add new file MySQL.pm, implementing the MySQL session storage backend.
Based on original code by Walid Moghrabi, but modified.
Will fail to execute correctly, so do not use yet.
---
X2Go/Server/DB/MySQL.pm | 714 ++++++++++++++++++++++++++++++++++++++++++++++++
debian/changelog | 3 +
2 files changed, 717 insertions(+)
diff --git a/X2Go/Server/DB/MySQL.pm b/X2Go/Server/DB/MySQL.pm
new file mode 100644
index 0000000..6771724
--- /dev/null
+++ b/X2Go/Server/DB/MySQL.pm
@@ -0,0 +1,714 @@
+# Copyright (C) 2007-2018 X2Go Project - http://wiki.x2go.org
+# Copyright (C) 2007-2018 Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
+# Copyright (C) 2007-2018 Heinz-Markus Graesing <heinz-m.graesing at obviously-nice.de>
+# Copyright (C) 2017-2018 Walid Moghrabi <w.moghrabi at servicemagic.eu>
+# Copyright (C) 2018 Mihai Moldovan <ionic at ionic.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 2 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, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+package X2Go::Server::DB::MySQL;
+
+=head1 NAME
+
+X2Go::Server::DB::MySQL - X2Go Session Database package for Perl (MySQL backend)
+
+=head1 DESCRIPTION
+
+X2Go::Server::DB::MySQL Perl package for X2Go::Server.
+
+=cut
+
+use strict;
+use DBI;
+use POSIX;
+use Sys::Syslog qw( :standard :macros );
+
+use X2Go::Log qw( loglevel );
+use X2Go::Config qw( get_config get_sqlconfig );
+use X2Go::Utils qw( sanitizer system_capture_stdout_output is_true );
+
+setlogmask( LOG_UPTO(loglevel()) );
+
+use base 'Exporter';
+
+our @EXPORT=('db_listsessions','db_listsessions_all', 'db_getservers', 'db_getagent', 'db_resume', 'db_changestatus', 'db_getstatus',
+ 'db_getdisplays', 'db_insertsession', 'db_insertshadowsession', 'db_getports', 'db_insertport', 'db_rmport', 'db_createsession', 'db_insertmount',
+ 'db_getmounts', 'db_deletemount', 'db_getdisplay', 'dbsys_getmounts', 'dbsys_listsessionsroot',
+ 'dbsys_listsessionsroot_all', 'dbsys_rmsessionsroot', 'dbsys_deletemounts', 'db_listshadowsessions','db_listshadowsessions_all');
+
+my ($uname, $pass, $uid, $pgid, $quota, $comment, $gcos, $homedir, $shell, $expire) = getpwuid(getuid());
+
+my $host;
+my $port;
+my $db="x2go_sessions";
+my $dbpass;
+my $dbuser;
+my $sslmode;
+my $with_TeKi;
+
+sub init_db
+{
+ # the $Config is required later (see below...)
+ my $Config = get_config;
+ $with_TeKi = is_true($Config->param("telekinesis.enable"));
+
+ if ( ! ( $dbuser and $dbpass ) )
+ {
+ my $SqlConfig = get_sqlconfig;
+ my $x2go_lib_path=system_capture_stdout_output("x2gopath", "libexec");
+
+ my $backend=$SqlConfig->param("backend");
+ if ( $backend ne "mysql" )
+ {
+ die "X2Go server is not configured to use the MySQL session db backend";
+ }
+
+ $host=$SqlConfig->param("mysql.host");
+ $port=$SqlConfig->param("mysql.port");
+ if (!$host)
+ {
+ $host='localhost';
+ }
+ if (!$port)
+ {
+ $port='3306';
+ }
+ my $passfile;
+ if ($uname eq 'root')
+ {
+ $dbuser='x2godbuser';
+ $passfile="/etc/x2go/x2gosql/passwords/x2gomysqladmin";
+ }
+ else
+ {
+ $dbuser="x2gouser_$uname";
+ $passfile="$homedir/.x2go/mysqlpass";
+ }
+ open (FL,"< $passfile") or die "Can't read password file $passfile<br><b>Use x2godbadmin on server to configure database access for user $uname</b><br>";
+ $dbpass=<FL>;
+ close(FL);
+ chomp($dbpass);
+ }
+
+ my $dbh = DBI->connect ("dbi:mysql:database=$db;host=$host;port=$port", "$dbuser", "$dbpass", {AutoCommit => 1}) or die $_;
+
+ return $dbh;
+}
+
+sub check_error
+{
+ my $sth = shift or die "Invalid or no statement handle parameter supplied";
+ my $fatal = shift;
+
+ my $func_name = (caller(1))[3];
+
+ $fatal = 1 unless defined($fatal);
+
+ if ($sth->err())
+ {
+ syslog('error', "$func_name (MySQL session DB backend) failed with exitcode: " . $sth->err() . ": " . $sth->errstr());
+
+ if ($fatal) {
+ die "$func_name (MySQL session DB backend): " . $sth->err() . ": " . $sth->errstr();
+ }
+ }
+}
+
+sub fetchrow_array_datasets
+{
+ my $sth = shift or die "Invalid or no statement handle parameter supplied";
+ my @lines;
+ while (my @data = $sth->fetchrow_array())
+ {
+ push @lines, join('|', @data);
+ }
+ return @lines;
+}
+
+sub fetchrow_array_datasets_single_framed
+{
+ my $sth = shift or die "Invalid or no statement handle parameter supplied";
+ my @lines;
+ while (my @data = $sth->fetchrow_array())
+ {
+ push @lines, "|" . @data[0] . "|";
+ }
+ return @lines;
+}
+
+sub fetchrow_array_datasets_double_spacelim
+{
+ my $sth = shift or die "Invalid or no statement handle parameter supplied";
+ my @lines;
+ while (my @data = $sth->fetchrow_array())
+ {
+ push @lines, @data[0] . " " . @data[1];
+ }
+ return @lines;
+}
+
+sub fetchrow_array_single_single
+{
+ my $sth = shift or die "Invalid or no statement handle parameter supplied";
+ my $ret = '';
+ if (my @data = $sth->fetchrow_array())
+ {
+ $ret = @data[0];
+ }
+ return $ret;
+}
+
+sub dbsys_rmsessionsroot
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ my $sth=$dbh->prepare("delete from sessions where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub dbsys_deletemounts
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ my $sth=$dbh->prepare("delete from mounts where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub dbsys_listsessionsroot
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my @strings;
+ my $sth = undef;
+ if ($with_TeKi) {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port, tekictrl_port, tekidata_port
+ from sessions
+ where server=? order by status desc");
+ } else {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions
+ where server=? order by status desc");
+ }
+ $sth->execute($server);
+ check_error($sth);
+ @strings = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @strings;
+}
+
+sub dbsys_listsessionsroot_all
+{
+ my $dbh = init_db();
+ my @strings;
+ my $sth = undef;
+ if ($with_TeKi) {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port, tekictrl_port, tekidata_port
+ from sessions
+ order by status desc");
+ } else {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions
+ order by status desc");
+ }
+ $sth->execute();
+ check_error($sth);
+ @strings = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @strings;
+}
+
+sub dbsys_getmounts
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my @mounts;
+ my $sth=$dbh->prepare("select client, path from mounts where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ @mounts = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @mounts;
+}
+
+sub db_getmounts
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my @mounts;
+ die "mounts_view must be implemented first!";
+ my $sth=$dbh->prepare("select client, path from mounts_view where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ @mounts = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @mounts;
+}
+
+sub db_deletemount
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $path = shift or die "argument \"path\" missing";
+ die "mounts_view must be implemented first!";
+ my $sth=$dbh->prepare("delete from mounts_view where session_id=? and path=?");
+ $sth->execute($sid, $path);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_insertmount
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $path = shift or die "argument \"path\" missing";
+ my $client = shift or die "argument \"client\" missing";
+ my $sth=$dbh->prepare("insert into mounts (session_id, path, client) values (?, ?, ?)");
+ $sth->execute($sid, $path, $client);
+ check_error($sth, 0);
+ my $success = (!($sth->err()));
+ $sth->finish();
+ undef $dbh;
+ return $success;
+}
+
+sub db_insertsession
+{
+ my $dbh = init_db();
+ my $display = shift or die "argument \"display\" missing";
+ $display = sanitizer('num', $display) or die "argument \"display\" malformed";
+ my $server = shift or die "argument \"server\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $sth=$dbh->prepare("insert into sessions
+ (display, server, uname, session_id)
+ values
+ (?, ?, ?, ?)");
+ $sth->execute($display, $server, $uname, $sid);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_insertshadowsession
+{
+ my $dbh = init_db();
+ my $display = shift or die "argument \"display\" missing";
+ $display = sanitizer('num', $display) or die "argument \"display\" malformed";
+ my $server = shift or die "argument \"server\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $shadreq_user = shift or die "argument \"shadreq_user\" missing";
+ my $sth=$dbh->prepare("insert into sessions
+ (display, server, uname, session_id)
+ values
+ (?, ?, ?, ?)");
+ $sth->execute($display, $server, $shadreq_user, $sid);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_createsession
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $cookie = shift or die "argument \"cookie\" missing";
+ my $pid = shift or die "argument \"pid\" missing";
+ $pid = sanitizer('num', $pid) or die "argument \"pid\" malformed";
+ my $client = shift or die "argument \"client\" missing";
+ my $gr_port = shift or die "argument \"gr_port\" missing";
+ $gr_port = sanitizer('num', $gr_port) or die "argument \"gr_port\" malformed";
+ my $snd_port = shift or die "argument \"snd_port\" missing";
+ $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed";
+ my $fs_port = shift or die "argument \"fs_port\" missing";
+ $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed";
+ my $sth;
+ die "sessions_view must be implemented first!";
+ if ($with_TeKi) {
+ my $tekictrl_port = shift or die "argument \"tekictrl_port\" missing";
+ $tekictrl_port = sanitizer('pnnum', $tekictrl_port) or die "argument \"tekictrl_port\" malformed";
+ my $tekidata_port = shift or die"argument \"tekidata_port\" missing";
+ $tekidata_port = sanitizer('pnnum', $tekidata_port) or die "argument \"tekidata_port\" malformed";
+ $sth=$dbh->prepare("update sessions_view set
+ status='R', last_time=NOW(),
+ cookie=?, agent_pid=?, client=?, gr_port=?,
+ sound_port=?, fs_port=?, tekictrl_port=?,
+ tekidata_port=?
+ where session_id=?");
+ $sth->execute($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid);
+ } else {
+ $sth=$dbh->prepare("update sessions_view set
+ status='R', last_time=NOW(),
+ cookie=?, agent_pid=?, client=?, gr_port=?,
+ sound_port=?, fs_port=?
+ where session_id=?");
+ $sth->execute($cookie, $pid, $client, $gr_port, $snd_port, $fs_port, $sid);
+ }
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_insertport
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $sshport = shift or die "argument \"port\" missing";
+ my $sth=$dbh->prepare("insert into used_ports (server,session_id,port) values (?, ?, ?)");
+ $sth->execute($server, $sid, $sshport);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_rmport
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $sshport = shift or die "argument \"port\" missing";
+ my $sth=$dbh->prepare("delete from used_ports where server=? and session_id=? and port=?");
+ $sth->execute($server, $sid, $sshport);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_resume
+{
+ my $dbh = init_db();
+ my $client = shift or die "argument \"client\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $gr_port = shift or die "argument \"gr_port\" missing";
+ $gr_port = sanitizer('num', $gr_port) or die "argument \"gr_port\" malformed";
+ my $snd_port = shift or die "argument \"snd_port\" missing";
+ $snd_port = sanitizer('num', $snd_port) or die "argument \"snd_port\" malformed";
+ my $fs_port = shift or die "argument \"fs_port\" missing";
+ $fs_port = sanitizer('num', $fs_port) or die "argument \"fs_port\" malformed";
+ my $sth;
+ die "sessions_view must be implemented first!";
+ if ($with_TeKi) {
+ my $tekictrl_port = shift or die "argument \"tekictrl_port\" missing";
+ $tekictrl_port = sanitizer('pnnum', $tekictrl_port) or die "argument \"tekictrl_port\" malformed";
+ my $tekidata_port = shift or die "argument \"tekidata_port\" missing";
+ $tekidata_port = sanitizer('pnnum', $tekidata_port) or die "argument \"tekidata_port\" malformed";
+ $sth=$dbh->prepare("update sessions_view set
+ last_time=NOW(), status='R', client=?, gr_port=?,
+ sound_port=?, fs_port=?, tekictrl_port=?,
+ tekidata_port=?
+ where session_id=?");
+ $sth->execute($client, $gr_port, $snd_port, $fs_port, $tekictrl_port, $tekidata_port, $sid);
+ } else {
+ $sth=$dbh->prepare("update sessions_view set
+ last_time=NOW(), status='R', client=?, gr_port=?,
+ sound_port=?, fs_port=?
+ where session_id=?");
+ $sth->execute($client, $gr_port, $snd_port, $fs_port, $sid);
+ }
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_changestatus
+{
+ my $dbh = init_db();
+ my $status = shift or die "argument \"status\" missing";
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("update sessions_view set last_time=NOW(), status=? where session_id=?");
+ $sth->execute($status, $sid);
+ check_error($sth);
+ $sth->finish();
+ undef $dbh;
+ return 1;
+}
+
+sub db_getstatus
+{
+ my $dbh = init_db();
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ my $status = '';
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("select status from sessions_view where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ $status = fetchrow_array_single_single($sth);
+ $sth->finish();
+ undef $dbh;
+ return $status;
+}
+
+sub db_getdisplays
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my @displays;
+ die "servers_view must be implemented first!";
+ my $sth=$dbh->prepare("select display from servers_view where server=?");
+ $sth->execute($server);
+ check_error($sth);
+ @displays = fetchrow_array_datasets_single_framed($sth);
+ $sth->finish();
+ undef $dbh;
+ return @displays;
+}
+
+sub db_getports
+{
+ my $dbh = init_db();
+ my @ports;
+ my $server = shift or die "argument \"server\" missing";
+ die "ports_view must be implemented first!";
+ my $sth=$dbh->prepare("select port from ports_view where server=?");
+ $sth->execute($server);
+ check_error($sth);
+ @ports = fetchrow_array_datasets_single_framed($sth);
+ $sth->finish();
+ undef $dbh;
+ return @ports;
+}
+
+sub db_getservers
+{
+ my $dbh = init_db();
+ my @servers;
+ die "servers_view must be implemented first!";
+ my $sth=$dbh->prepare("select server,count(*) from servers_view where status!='F' group by server");
+ $sth->execute();
+ check_error($sth);
+ @servers = fetchrow_array_datasets_double_spacelim($sth);
+ $sth->finish();
+ undef $dbh;
+ return @servers;
+}
+
+sub db_getagent
+{
+ my $dbh = init_db();
+ my $agent;
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("select
+ agent_pid
+ from sessions_view
+ where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ $agent = fetchrow_array_single_single($sth);
+ $sth->finish();
+ undef $dbh;
+ return $agent;
+}
+
+sub db_getdisplay
+{
+ my $dbh = init_db();
+ my $display;
+ my $sid = shift or die "argument \"session_id\" missing";
+ $sid = sanitizer('x2gosid', $sid) or die "argument \"session_id\" malformed";
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("select
+ display
+ from sessions_view
+ where session_id=?");
+ $sth->execute($sid);
+ check_error($sth);
+ $display = fetchrow_array_single_single($sth);
+ $sth->finish();
+ undef $dbh;
+ return $display;
+}
+
+sub db_listsessions
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my @sessions;
+ my $sth;
+ die "sessions_view must be implemented first!";
+ if ($with_TeKi) {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port, tekictrl_port, tekidata_port
+ from sessions_view
+ where status!='F' and server=? and (session_id not like '%XSHAD%')
+ order by status desc");
+ } else {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions_view
+ where status!='F' and server=? and (session_id not like '%XSHAD%')
+ order by status desc");
+ }
+ $sth->execute($server);
+ check_error($sth);
+ @sessions = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @sessions;
+}
+
+sub db_listsessions_all
+{
+ my $dbh = init_db();
+ my @sessions;
+ my $sth;
+ die "sessions_view must be implemented first!";
+ if ($with_TeKi) {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port, tekictrl_port, tekidata_port
+ from sessions_view
+ where status!='F' and (session_id not like '%XSHAD%')
+ order by status desc");
+ } else {
+ $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions_view
+ where status!='F' and (session_id not like '%XSHAD%')
+ order by status desc");
+ }
+ $sth->execute();
+ check_error($sth);
+ @sessions = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @sessions;
+}
+
+sub db_listshadowsessions
+{
+ my $dbh = init_db();
+ my $server = shift or die "argument \"server\" missing";
+ my @sessions;
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions_view
+ where status!='F' and server=? and (session_id like '%XSHAD%')
+ order by status desc");
+ $sth->execute($server);
+ check_error($sth);
+ @sessions = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @sessions;
+}
+
+sub db_listshadowsessions_all
+{
+ my $dbh = init_db();
+ my @sessions;
+ die "sessions_view must be implemented first!";
+ my $sth=$dbh->prepare("select
+ agent_pid, session_id, display, server, status,
+ DATE_FORMAT(init_time, '%Y-%m-%dT%H:%i:%S'), cookie, client,
+ gr_port, sound_port,
+ DATE_FORMAT(last_time, '%Y-%m-%dT%H:%i:%S'), uname,
+ MOD(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(init_time), 86400),
+ fs_port
+ from sessions_view
+ where status!='F' and (session_id is like '%XSHAD%')
+ order by status desc");
+ $sth->execute();
+ check_error($sth);
+ @sessions = fetchrow_array_datasets($sth);
+ $sth->finish();
+ undef $dbh;
+ return @sessions;
+}
+
+1;
diff --git a/debian/changelog b/debian/changelog
index ed9b5d5..ff8bca6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -92,6 +92,9 @@ x2goserver (4.1.0.1-0x2go1) UNRELEASED; urgency=medium
- X2Go/Server/DB/PostgreSQL.pm: fix syntax error.
- x2goserver/sbin/x2godbadmin: don't use prototypes when functions
actually take arguments.
+ - X2Go/Server/DB: add new file MySQL.pm, implementing the MySQL session
+ storage backend. Based on original code by Walid Moghrabi, but modified.
+ Will fail to execute correctly, so do not use yet.
* debian/{control,compat}:
+ Bump DH compat level to 9.
* debian/:
--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
More information about the x2go-commits
mailing list