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 8d70e8d4f91653fd0e411368f1ba1ea283bb6b88
Author: Mihai Moldovan <io...@ionic.de>
Date:   Sat Feb 24 00:15:26 2018 +0100

    x2goserver/sbin/x2godbadmin: implement MySQL support, based on Walid 
Moghrabis changes, but slightly amended.
    
    Caveat: INCOMPATIBLE DATABASE SCHEMA!
---
 debian/changelog            |   3 +
 x2goserver/sbin/x2godbadmin | 366 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 369 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 0c99f9f..3938088 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -81,6 +81,9 @@ x2goserver (4.1.0.1-0x2go1) UNRELEASED; urgency=medium
       namespace.
     - x2goserver/sbin/x2godbadmin: remove potentially confusing whitespace.
     - x2goserver/sbin/x2godbadmin: fix up other try blocks; whitespace only.
+    - x2goserver/sbin/x2godbadmin: implement MySQL support, based on Walid
+      Moghrabis changes, but slightly amended. Caveat: INCOMPATIBLE DATABASE
+      SCHEMA!
   * debian/{control,compat}:
     + Bump DH compat level to 9.
   * debian/:
diff --git a/x2goserver/sbin/x2godbadmin b/x2goserver/sbin/x2godbadmin
index 4332738..0bd1555 100755
--- a/x2goserver/sbin/x2godbadmin
+++ b/x2goserver/sbin/x2godbadmin
@@ -403,6 +403,111 @@ if ($Config->param("backend") eq 'postgres')
        }
 }
 
+if ($Config->param("backend") eq 'mysql')
+{
+       my $host=$Config->param("mysql.host");
+       my $port=$Config->param("mysql.port");
+       my $unet=$Config->param("mysql.unet");
+       my $dbadmin=$Config->param("mysql.dbadmin");
+       my $x2goadmin="x2godbuser";
+       my $x2goadminpass=`pwgen 8 1`;
+       chomp ($x2goadminpass);
+       my $db="x2go_sessions";
+
+       if (!$host)
+       {
+               $host='localhost';
+       }
+       if (!$port)
+       {
+               $port='3306';
+       }
+       if (!$dbadmin)
+       {
+               $dbadmin='root';
+       }
+
+       open (FL,"< /etc/x2go/x2gosql/passwords/mysqladmin") or die "Can't read 
password file /etc/x2go/x2gosql/passwords/mysqladmin";
+       my $dbadminpass=<FL>;
+       close(FL);
+       chomp($dbadminpass);
+
+       if ($updatedb)
+       {
+               # check if the DB already exists, if not, create it...
+               my $dbh;
+               until (
+                       $dbh = 
DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", "$dbadmin", 
"$dbadminpass", {AutoCommit => 1, RaiseError => 0, PrintError => 0})
+               )
+               {
+                       $createdb = 1;
+                       last;
+               };
+               if (!$createdb) {
+                       $dbh = 
DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", "$dbadmin", 
"$dbadminpass", {AutoCommit => 1});
+                       if ($dbh) {
+                               # Intentionally left blank.
+                               # MySQL support was only added in X2Go Server 
4.1.0.1, while SQLite and PostgreSQL support
+                               # have been around prior to 4.1.0.0, which is 
the first version that introduced new teki-related
+                               # columns.
+                       }
+                       if ($dbh) {
+                               undef $dbh;
+                       }
+                       exit(0);
+               }
+               else
+               {
+                       print "No session DB found. Use --createdb instead of 
--updatedb.\n";
+               }
+       }
+
+       if ($createdb)
+       {
+               create_database($host, $port, $dbadmin, $dbadminpass, $db, 
$x2goadmin, $x2goadminpass, $unet);
+               create_tables($host, $port, $dbadmin, $dbadminpass, $db, 
$x2goadmin, $unet);
+               exit(0);
+       }
+
+       if ($listusers)
+       {
+               list_users($host, $port, $dbadmin, $dbadminpass);
+               exit(0);
+       }
+
+       if ($adduser)
+       {
+               add_user($host, $port, $dbadmin, $dbadminpass, $db, $adduser, 
$unet);
+       }
+
+       if ($addgroup)
+       {
+               my ($name, $passwd, $gid, $members) = getgrnam($addgroup);
+               my @grp_members=split(' ',$members);
+               foreach (@grp_members)
+               {
+                       chomp($_);
+                       add_user($host, $port, $dbadmin, $dbadminpass, $db, $_, 
$unet);
+               }
+       }
+
+       if ($rmuser)
+       {
+               rm_user($host, $port, $dbadmin, $dbadminpass, $db, $rmuser, 
$unet);
+       }
+
+       if ($rmgroup)
+       {
+               my ($name, $passwd, $gid, $members) = getgrnam($rmgroup);
+               my @grp_members=split(' ',$members);
+               foreach (@grp_members)
+               {
+                       chomp($_);
+                       rm_user($host, $port, $dbadmin, $dbadminpass, $db, $_, 
$unet);
+               }
+       }
+}
+
 sub create_tables()
 {
        my $host = shift or die "No host parameter supplied";
@@ -413,6 +518,7 @@ sub create_tables()
        my $x2goadmin = shift or die "No x2goadmin (user-level database 
username) parameter supplied";
 
        my $sslmode = undef;
+       my $unet = undef;
 
        if ($Config->param("backend") eq 'postgres')
        {
@@ -420,6 +526,12 @@ sub create_tables()
 
                pg_create_tables($host, $port, $dbadmin, $dbadminpass, $db, 
$x2goadmin, $sslmode);
        }
+       elsif ($Config->param("backend") eq 'mysql')
+       {
+               $unet = shift or die "No unet parameter supplied";
+
+               mysql_create_tables($host, $port, $dbadmin, $dbadminpass, $db, 
$x2goadmin, $unet);
+       }
        else
        {
                die "Invalid database backend";
@@ -615,6 +727,87 @@ sub pg_create_tables()
        undef $dbh;
 }
 
+sub mysql_create_tables()
+{
+       my $host = shift or die "No host parameter supplied";
+       my $port = shift or die "No port parameter supplied";
+       my $dbadmin = shift or die "No dbadmin parameter supplied";
+       my $dbadminpass = shift or die "No dbadminpass (database administrator 
password) parameter supplied";
+       my $db = shift or die "No db parameter supplied";
+       my $x2goadmin = shift or die "No x2goadmin (user-level database 
username) parameter supplied";
+       my $unet = shift or die "No unet parameter supplied";
+
+       my $dbh = DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", 
"$dbadmin", "$dbadminpass", {AutoCommit => 1}) or die $_;
+
+       my $sth=$dbh->prepare("
+                             CREATE TABLE `sessions` (
+                             `session_id` varchar(2048) NOT NULL,
+                             `display` int NOT NULL,
+                             `uname` varchar(100) NOT NULL,
+                             `server` varchar(512) NOT NULL,
+                             `client` varchar(45) DEFAULT NULL,
+                             `status` char(1) NOT NULL DEFAULT 'R',
+                             `init_time` datetime NOT NULL DEFAULT 
CURRENT_TIMESTAMP,
+                             `last_time` datetime NOT NULL DEFAULT 
CURRENT_TIMESTAMP,
+                             `cookie` char(33) DEFAULT NULL,
+                             `agent_pid` int DEFAULT NULL,
+                             `gr_port` int DEFAULT NULL,
+                             `sound_port` int DEFAULT NULL,
+                             `fs_port` int DEFAULT NULL,
+                             `tekictrl_port` int DEFAULT NULL,
+                             `tekidata_port` int DEFAULT NULL,
+                             PRIMARY KEY (`session_id`),
+                             UNIQUE KEY `idx_sessions_display_server` 
(`display`,`server`))
+                             ");
+       $sth->execute() or die;
+
+       $sth=$dbh->prepare("
+                          CREATE TABLE `messages` (
+                          `mess_id` varchar(20) NOT NULL,
+                          `mesage` longtext,
+                          PRIMARY KEY (`mess_id`))
+                          ");
+       $sth->execute() or die;
+
+       $sth=$dbh->prepare("
+                          CREATE TABLE `user_messages` (
+                          `mess_id` varchar(20) NOT NULL,
+                          `uname` varchar(100) NOT NULL,
+                          PRIMARY KEY (`mess_id`))
+                          ");
+       $sth->execute() or die;
+
+
+       $sth=$dbh->prepare("
+                          CREATE TABLE `used_ports` (
+                          `server` varchar(512) NOT NULL,
+                          `session_id` varchar(2048) DEFAULT NULL,
+                          `port` int NOT NULL,
+                          PRIMARY KEY (`port`),
+                          KEY `used_ports_session_id_fkey_idx` (`session_id`),
+                          CONSTRAINT `used_ports_session_id_fkey` FOREIGN KEY 
(`session_id`) REFERENCES `sessions` (`session_id`) ON DELETE CASCADE ON UPDATE 
NO ACTION)
+                          ");
+       $sth->execute() or die;
+
+       $sth=$dbh->prepare("
+                          CREATE TABLE `mounts` (
+                          `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+                          `session_id` varchar(2048) DEFAULT NULL,
+                          `path` varchar(2048) NOT NULL,
+                          `client` varchar(45) NOT NULL,
+                          PRIMARY KEY (`id`),
+                          UNIQUE KEY `mounts_pkey` (`path`,`client`),
+                          KEY `mounts_session_id_fkey_idx` (`session_id`),
+                          CONSTRAINT `mounts_session_id_fkey` FOREIGN KEY 
(`session_id`) REFERENCES `sessions` (`session_id`) ON DELETE RESTRICT ON 
UPDATE NO ACTION)
+                          ");
+       $sth->execute() or die;
+
+       $sth=$dbh->prepare("GRANT ALL PRIVILEGES ON `sessions`, `messages`, 
`user_messages`, `used_ports`, `mounts` TO `$x2goadmin`@`$unet`");
+       $sth->execute() or die;
+       $sth->finish();
+       undef $dbh;
+}
+
 sub create_database()
 {
        my $host = shift or die "No host parameter supplied";
@@ -626,6 +819,7 @@ sub create_database()
        my $x2goadminpass = shift or die "No x2goadminpass (user-level database 
pasword) parameter supplied";
 
        my $sslmode = undef;
+       my $unet = undef;
 
        if ($Config->param("backend") eq 'postgres')
        {
@@ -633,6 +827,12 @@ sub create_database()
 
                pg_create_database($host, $port, $dbadmin, $dbadminpass, $db, 
$x2goadmin, $x2goadminpass, $sslmode);
        }
+       elsif ($Config->param("backend") eq 'mysql')
+       {
+               $unet = shift or die "No unet parameter supplied";
+
+               mysql_create_database($host, $port, $dbadmin, $dbadminpass, 
$db, $x2goadmin, $x2goadminpass, $unet);
+       }
        else
        {
                die "Invalid database backend";
@@ -671,6 +871,38 @@ sub pg_create_database
        undef $dbh;
 }
 
+sub mysql_create_database()
+{
+       my $host = shift or die "No host parameter supplied";
+       my $port = shift or die "No port parameter supplied";
+       my $dbadmin = shift or die "No dbadmin parameter supplied";
+       my $dbadminpass = shift or die "No dbadminpass (database administrator 
password) parameter supplied";
+       my $db = shift or die "No db parameter supplied";
+       my $x2goadmin = shift or die "No x2goadmin (user-level database 
username) parameter supplied";
+       my $x2goadminpass = shift or die "No x2goadminpass (user-level database 
pasword) parameter supplied";
+       my $unet = shift or die "No unet parameter supplied";
+
+       my $dbh=DBI->connect("dbi:mysql:database=mysql;host=$host;port=$port", 
"$dbadmin", "$dbadminpass", {AutoCommit => 1}) or die $_;
+       #drop db if exists
+       my $sth=$dbh->prepare("DROP DATABASE IF EXISTS `$db`");
+       $sth->execute();
+       #drop x2goadmin
+       $sth=$dbh->prepare("DROP USER IF EXISTS `$x2goadmin`@`$unet`");
+       $sth->execute();
+       #create db
+       $sth=$dbh->prepare("CREATE DATABASE IF NOT EXISTS `$db`");
+       $sth->execute() or die;
+       #create x2goadmin
+       $sth=$dbh->prepare("CREATE USER `$x2goadmin`@`$unet` IDENTIFIED BY 
'$x2goadminpass'");
+       $sth->execute() or die;
+       #save x2goadmin password
+       open (FL,"> /etc/x2go/x2gosql/passwords/x2gomysqladmin") or die "Can't 
write password file /etc/x2go/x2gosql/passwords/x2gomysqladmin";
+       print FL $x2goadminpass;
+       close(FL);
+       $sth->finish();
+       undef $dbh;
+}
+
 sub list_users()
 {
        my $host = shift or die "No host parameter supplied";
@@ -686,6 +918,10 @@ sub list_users()
 
                pg_list_users($host, $port, $dbadmin, $dbadminpass, $sslmode);
        }
+       elsif ($Config->param("backend") eq 'mysql')
+       {
+               mysql_list_users($host, $port, $dbadmin, $dbadminpass, $db);
+       }
        else
        {
                die "Invalid database backend";
@@ -715,6 +951,28 @@ sub pg_list_users()
        undef $dbh;
 }
 
+sub mysql_list_users()
+{
+       my $host = shift or die "No host parameter supplied";
+       my $port = shift or die "No port parameter supplied";
+       my $dbadmin = shift or die "No dbadmin parameter supplied";
+       my $dbadminpass = shift or die "No dbadminpass (database administrator 
password) parameter supplied";
+
+       my $dbh=DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", 
"$dbadmin", "$dbadminpass", {AutoCommit => 1}) or die $_;
+       my $sth=$dbh->prepare("select user from mysql.user where user like 
'x2gouser_%'");
+       $sth->execute()or die;
+       printf ("%-20s DB user\n","UNIX user");
+       print "---------------------------------------\n";
+       my @data;
+       while (@data = $sth->fetchrow_array)
+       {
+               @data[0]=~s/x2gouser_//;
+               printf ("%-20s x2gouser_@data[0]\n",@data[0]);
+       }
+       $sth->finish();
+       undef $dbh;
+}
+
 sub add_user()
 {
        my $host = shift or die "No host parameter supplied";
@@ -725,6 +983,7 @@ sub add_user()
        my $user_to_add = shift or die "No user-to-add parameter supplied";
 
        my $sslmode = undef;
+       my $unet = undef;
 
        if ($Config->param("backend") eq 'postgres')
        {
@@ -732,6 +991,12 @@ sub add_user()
 
                pg_add_user($host, $port, $dbadmin, $dbadminpass, $db, 
$user_to_add, $sslmode);
        }
+       elsif ($Config->param("backend") eq 'mysql')
+       {
+               $unet = shift or die "No unet parameter supplied";
+
+               mysql_add_user($host, $port, $dbadmin, $dbadminpass, $db, 
$user_to_add, $unet);
+       }
        else
        {
                die "Invalid database backend";
@@ -823,6 +1088,71 @@ sub pg_add_user()
        chown($uid,$pgid,"$dir/.x2go/pgsqlpass");
 }
 
+sub mysql_add_user()
+{
+       my $host = shift or die "No host parameter supplied";
+       my $port = shift or die "No port parameter supplied";
+       my $dbadmin = shift or die "No dbadmin parameter supplied";
+       my $dbadminpass = shift or die "No dbadminpass (database administrator 
password) parameter supplied";
+       my $db = shift or die "No db parameter supplied";
+       my $user_to_add = shift or die "No user-to-add parameter supplied";
+       my $unet = shift or die "No unet parameter supplied";
+
+       my $dbh=DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", 
"$dbadmin", "$dbadminpass", {AutoCommit => 1}) or die $_;
+       my ($name, $pass, $uid, $pgid, $quota, $comment, $gcos, $dir, $shell, 
$expire) = getpwnam($user_to_add);
+       if (! $name)
+       {
+               print "Cannot find user ($user_to_add)\n";
+               return;
+       }
+       elsif ($name eq "root")
+       {
+               print "The super-user \"root\" is not allowed to use X2Go\n";
+               return;
+       }
+       $pass=`pwgen -s -c -n 32 1`;
+       chomp($pass);
+
+       my $sth=$dbh->prepare("DROP USER IF EXISTS 
`x2gouser_$user_to_add`@`$unet`");
+       $sth->{Warn}=0;
+       $sth->{PrintError}=0;
+       $sth->execute();
+
+       print ("create DB user \"x2gouser_$user_to_add\"\n");
+       $sth=$dbh->prepare("CREATE USER `x2gouser_$user_to_add`@`$unet` 
IDENTIFIED BY '$pass'");
+       $sth->execute();
+
+       $sth=$dbh->prepare("GRANT SELECT, INSERT, UPDATE, DELETE ON * TO 
`x2gouser_$user_to_add`@`$unet`");
+       $sth->execute();
+
+       $sth->finish();
+
+       if (! -d "$dir/.x2go" )
+       {
+                       if ( defined (&File::Path::make_path) )
+                       {
+                               File::Path::make_path("$dir/.x2go");
+                       }
+                       elsif ( defined (&File::Path::mkpath) )
+                       {
+                               File::Path::mkpath("$dir/.x2go");
+                       }
+                       else
+                       {
+                               die "Unable to create folders with File::Path";
+                       }
+       }
+
+       #save user password
+       open (FL,"> $dir/.x2go/mysqlpass") or die "Can't open password file 
$dir/.x2go/mysqlpass";
+       print FL $pass;
+       close(FL);
+       chmod(0700,"$dir/.x2go");
+       chown($uid,$pgid,"$dir/.x2go");
+       chmod(0600,"$dir/.x2go/mysqlpass");
+       chown($uid,$pgid,"$dir/.x2go/mysqlpass");
+}
+
 sub rm_user()
 {
        my $host = shift or die "No host parameter supplied";
@@ -833,6 +1163,7 @@ sub rm_user()
        my $user_to_remove = shift or die "No user-to-remove parameter 
supplied";
 
        my $sslmode = undef;
+       my $unet = undef;
 
        if ($Config->param("backend") eq 'postgres')
        {
@@ -840,6 +1171,12 @@ sub rm_user()
 
                pg_rm_user($host, $port, $dbadmin, $dbadminpass, $db, 
$user_to_remove, $sslmode);
        }
+       elsif ($Config->param("backend") eq 'mysql')
+       {
+               $unet = shift or die "No unet parameter supplied";
+
+               mysql_rm_user($host, $port, $dbadmin, $dbadminpass, $db, 
$user_to_remove, $unet);
+       }
        else
        {
                die "Invalid database backend";
@@ -887,3 +1224,32 @@ sub pg_rm_user()
                unlink("$dir/.x2go/sqlpass");
        }
 }
+
+sub mysql_rm_user()
+{
+       my $host = shift or die "No host parameter supplied";
+       my $port = shift or die "No port parameter supplied";
+       my $dbadmin = shift or die "No dbadmin parameter supplied";
+       my $dbadminpass = shift or die "No dbadminpass (database administrator 
password) parameter supplied";
+       my $db = shift or die "No db parameter supplied";
+       my $user_to_remove = shift or die "No user-to-remove parameter 
supplied";
+       my $unet = shift or die "No unet parameter supplied";
+
+       my $dbh=DBI->connect("dbi:mysql:database=$db;host=$host;port=$port", 
"$dbadmin", "$dbadminpass", {AutoCommit => 1}) or die $_;
+
+       print ("rm DB user \"x2gouser_$user_to_remove\"\n");
+
+       my $sth=$dbh->prepare("DROP USER IF EXISTS 
`x2gouser_$user_to_remove`@`$unet`");
+       $sth->execute();
+       $sth->finish();
+
+       my ($name, $pass, $uid, $pgid, $quota, $comment, $gcos, $dir, $shell, 
$expire) = getpwnam($user_to_remove);
+       if (! $uid)
+       {
+               return;
+       }
+       if ( -e "$dir/.x2go/mysqlpass" )
+       {
+               unlink("$dir/.x2go/mysqlpass");
+       }
+}

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on 
/srv/git/code.x2go.org/x2goserver.git
_______________________________________________
x2go-commits mailing list
x2go-commits@lists.x2go.org
https://lists.x2go.org/listinfo/x2go-commits

Reply via email to