Browse Source

WIP. vchamilo plugin - Use chash to upgrade database to 1.11.x

jmontoyaa 8 years ago
parent
commit
44cb4516b6

+ 1 - 0
.gitignore

@@ -42,6 +42,7 @@ plugin/bbb/config.vm.php
 
 # Cron temp files
 main/cron/incoming/*
+plugin/vchamilo/templates/*
 
 # Stuff updated through composer - Remove just before release
 composer.lock

+ 112 - 49
plugin/vchamilo/lib/Virtual.php

@@ -3,6 +3,9 @@
 
 use Cocur\Slugify\Slugify;
 use Symfony\Component\Finder\Finder;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\StreamOutput;
+use Symfony\Component\Console\Application;
 
 /**
  * Class Virtual
@@ -268,13 +271,31 @@ class Virtual
         $databaseToDelete = $params->main_database;
         unset($params->main_database);
         $connection = self::getConnectionFromInstance($params);
-        $databases = $connection->getSchemaManager()->listDatabases();
+        if ($connection) {
+            $databases = $connection->getSchemaManager()->listDatabases();
 
-        if (in_array($databaseToDelete, $databases)) {
-            $connection->getSchemaManager()->dropDatabase($databaseToDelete);
-            Display::addFlash(Display::return_message('Database deleted: '.$databaseToDelete));
+            if (in_array($databaseToDelete, $databases)) {
+                $connection->getSchemaManager()->dropDatabase(
+                    $databaseToDelete
+                );
+                Display::addFlash(
+                    Display::return_message(
+                        'Database deleted: '.$databaseToDelete
+                    )
+                );
+            } else {
+                Display::addFlash(
+                    Display::return_message(
+                        'Database does not exist: '.$databaseToDelete
+                    )
+                );
+            }
         } else {
-            Display::addFlash(Display::return_message('Database does not exist: '.$databaseToDelete));
+            Display::addFlash(
+                Display::return_message(
+                    "Cannot connect DB: $databaseToDelete"
+                )
+            );
         }
 
         return false;
@@ -291,21 +312,28 @@ class Virtual
         unset($params->main_database);
 
         $connection = Virtual::getConnectionFromInstance($params);
-        $databaseList = $connection->getSchemaManager()->listDatabases();
+        if ($connection) {
+            $databaseList = $connection->getSchemaManager()->listDatabases();
 
-        if (!in_array($databaseName, $databaseList)) {
-            $connection->getSchemaManager()->createDatabase($databaseName);
-            Display::addFlash(Display::return_message("Creating DB ".$databaseName));
-        } else {
-            Display::addFlash(Display::return_message("DB already exists: ".$databaseName));
-        }
+            if (!in_array($databaseName, $databaseList)) {
+                $connection->getSchemaManager()->createDatabase($databaseName);
+                Display::addFlash(
+                    Display::return_message("Creating DB ".$databaseName)
+                );
+            } else {
+                Display::addFlash(
+                    Display::return_message("DB already exists: ".$databaseName)
+                );
+            }
 
-        return true;
+            return true;
+        }
+        return false;
     }
 
     /**
     * get a proper SQLdump command
-    * @param object $vmoodledata the complete new host information
+    * @param object $vchamilodata the complete new host information
     * @return string the shell command
     */
     public static function getDatabaseDumpCmd($vchamilodata)
@@ -327,17 +355,21 @@ class Virtual
         // Retrieves the host configuration (more secure).
         $vchamilodata = empty($vchamilodata) ? Virtual::makeThis() : $vchamilodata;
         if (strstr($vchamilodata->db_host, ':') !== false) {
-            list($vchamilodata->db_host, $vchamilodata->db_port) = explode(':', $vchamilodata->db_host);
+            list($vchamilodata->db_host, $vchamilodata->db_port) = explode(
+                ':',
+                $vchamilodata->db_host
+            );
         }
 
         // Password.
+        $databasePassword = '';
         if (!empty($vchamilodata->db_password)) {
-            $vchamilodata->db_password = '-p'.escapeshellarg($vchamilodata->db_password).' ';
+            $databasePassword = '-p'.escapeshellarg($vchamilodata->db_password).' ';
         }
 
         // Making the command line (see 'vconfig.php' file for defining the right paths).
         $sqlcmd = $pgm.' -h'.$vchamilodata->db_host.(isset($vchamilodata->db_port) ? ' -P'.$vchamilodata->db_port.' ' : ' ' );
-        $sqlcmd .= '-u'.$vchamilodata->db_user.' '.$vchamilodata->db_password;
+        $sqlcmd .= '-u'.$vchamilodata->db_user.' '.$databasePassword;
         $sqlcmd .= '%DATABASE% < ';
 
         return $sqlcmd;
@@ -384,12 +416,12 @@ class Virtual
     }
 
     /**
-     * Dumps a SQL database for having a snapshot.
+     * Backups a database for having a snapshot.
      * @param        $vchamilo    object        The Vchamilo object.
      * @param        $outputfilerad    string        The output SQL file radical.
      * @return        bool    If TRUE, dumping database was a success, otherwise FALSE.
      */
-    public static function dumpDatabase($vchamilo, $outputfilerad)
+    public static function backupDatabase($vchamilo, $outputfilerad)
     {
         // Separating host and port, if sticked.
         if (strstr($vchamilo->db_host, ':') !== false) {
@@ -449,19 +481,9 @@ class Virtual
             foreach ($cmds as $cmd) {
                 // Final command.
                 $cmd = $pgm.' '.$cmd;
-                // Prints log messages in the page and in 'cmd.log'.
-                /*if ($LOG = fopen(dirname($outputfilerad).'/cmd.log', 'a')){
-                    fwrite($LOG, $cmd."\n");
-                }*/
 
                 // Executes the SQL command.
                 exec($cmd, $execoutput, $returnvalue);
-
-                /*if ($LOG){
-                    foreach($execoutput as $execline) fwrite($LOG, $execline."\n");
-                    fwrite($LOG, $returnvalue."\n");
-                    fclose($LOG);
-                }*/
             }
         }
 
@@ -651,6 +673,7 @@ class Virtual
      */
     public static function ctrace($str)
     {
+        error_log($str);
         Display::addFlash(Display::return_message($str, 'normal', false));
     }
 
@@ -826,10 +849,8 @@ class Virtual
             }
 
             return $manager->getConnection();
-
         } catch (Exception $e) {
             echo $e->getMessage();
-            exit;
         }
     }
 
@@ -1020,16 +1041,24 @@ class Virtual
             );
             return false;
         } else {
-            $connection = Virtual::getConnectionFromInstance($data);
-            $statement = $connection->query('SELECT * FROM settings_current');
-            $settings = $statement->fetchAll();
-            $settings = array_column($settings, 'selected_value', 'variable');
-            $institution = $settings['Institution'];
-            $siteName = $settings['siteName'];
-            $newDatabase->sitename = $siteName;
-            $newDatabase->institution = $institution;
-            $slug = $newDatabase->slug = $data->slug = Virtual::getSlugFromUrl($data->root_web);
-            $id = Database::insert($table, (array) $newDatabase);
+            /** @var \Doctrine\ORM\EntityManager $em */
+            $em = Virtual::getConnectionFromInstance($data, true);
+            if ($em) {
+                $connection = $em->getConnection();
+                $statement = $connection->query('SELECT * FROM settings_current');
+                $settings = $statement->fetchAll();
+                $settings = array_column(
+                    $settings,
+                    'selected_value',
+                    'variable'
+                );
+                $institution = $settings['Institution'];
+                $siteName = $settings['siteName'];
+                $newDatabase->sitename = $siteName;
+                $newDatabase->institution = $institution;
+                $slug = $newDatabase->slug = $data->slug = Virtual::getSlugFromUrl($data->root_web);
+                $id = Database::insert($table, (array)$newDatabase);
+            }
         }
 
         if (!$id) {
@@ -1042,13 +1071,17 @@ class Virtual
 
         self::createDirsFromSlug($slug);
         self::ctrace("Create database");
-        Virtual::createDatabase($newDatabase);
+        $databaseCreated = Virtual::createDatabase($newDatabase);
+        if (!$databaseCreated) {
+            Display::addFlash(
+                Display::return_message('Error while creating a DB', 'error')
+            );
+            return false;
+        }
 
         $dumpFile = api_get_path(SYS_ARCHIVE_PATH).uniqid($data->main_database.'_dump_', true).'.sql';
-
         self::ctrace('Create backup from "'.$data->main_database.'" here: '.$dumpFile.' ');
-
-        Virtual::dumpDatabase($data, $dumpFile);
+        Virtual::backupDatabase($data, $dumpFile);
 
         $sqlcmd = Virtual::getDatabaseDumpCmd($newDatabase);
         $sqlcmd = str_replace('%DATABASE%', $newDatabase->main_database, $sqlcmd);
@@ -1058,17 +1091,47 @@ class Virtual
         if (!defined('CLI_SCRIPT')) {
             putenv('LANG=en_US.utf-8');
         }
+
         // ensure utf8 is correctly handled by php exec()
         // @see http://stackoverflow.com/questions/10028925/call-a-program-via-shell-exec-with-utf-8-text-input
-
-        exec($import, $output, $return);
+        $result = exec($import, $output, $return);
 
         self::ctrace('Restore backup here "'.$newDatabase->main_database.'" : <br />'.$import.' ');
+        self::ctrace($result);
 
-        if (!empty($output)) {
-            Display::addFlash(Display::return_message(implode("\n", $output)."\n"));
+        $command = new \Chash\Command\Installation\UpgradeDatabaseCommand();
+        // Creates the helper set
+        $helperSet = \Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($em);
+
+        $helpers = array(
+            'configuration' => new Chash\Helpers\ConfigurationHelper(),
+            'dialog' => new \Symfony\Component\Console\Helper\QuestionHelper(),
+        );
+
+        foreach ($helpers as $name => $helper) {
+            $helperSet->set($helper, $name);
         }
 
+        $command->setHelperSet($helperSet);
+
+        $tmpFile = tmpfile();
+        $outputStream = new \Symfony\Component\Console\Output\BufferedOutput($tmpFile);
+
+        $arguments = array(
+            'from-version' => '1.10.0',
+            'to-version' => '1.11.x',
+            'host' => $newDatabase->db_host,
+            'username' => $newDatabase->db_user,
+            'password' => $newDatabase->db_password,
+            'db_name' => $newDatabase->main_database,
+            'root_sys' => api_get_configuration_value('root_sys')
+        );
+
+        $input = new ArrayInput($arguments);
+        $command->run($input, $outputStream);
+
+        Display::addFlash(Display::return_message($outputStream->fetch());
+
         @unlink($dumpFile);
 
         $coursePath = self::getConfig('vchamilo', 'course_real_root').'/'.$slug;

+ 1 - 1
plugin/vchamilo/plugin.php

@@ -21,7 +21,7 @@ $plugin_info['title'] = 'Chamilo Virtualization';
 //the comments that go with the plugin
 $plugin_info['comment'] = "Holds chamilo virtualisation tools";
 //the plugin version
-$plugin_info['version'] = '1.0';
+$plugin_info['version'] = '1.2';
 //the plugin author
 $plugin_info['author'] = 'Valery Fremaux, Julio Montoya';
 

+ 1 - 1
plugin/vchamilo/views/manage.controller.php

@@ -203,7 +203,7 @@ switch ($action) {
             if ($vchamilostep == 1) {
                 // Auto dump the databases in a master template folder.
                 // this will create three files : dump.sql
-                $result = Virtual::dumpDatabase($vchamilo, $absolute_sqldir);
+                $result = Virtual::backupDatabase($vchamilo, $absolute_sqldir);
 
                 if (empty($fullautomation)) {
                     if (!$result) {

+ 1 - 1
plugin/vchamilo/views/manage.php

@@ -77,7 +77,7 @@ foreach ($instances as $instance) {
 
     if (!$instance->visible) {
         $cmd .= '<a onclick="javascript:if(!confirm(\''.get_lang('AreYouSureToDelete').'\')) return false;" href="'.$thisurl.'?what=fulldeleteinstances&vids[]='.$instance->id.'" title="'.$plugin->get_lang('destroyinstances').'">
-        &nbsp;'.Display::returnFontAwesomeIcon('remove').' </a>';
+        &nbsp;'.Display::returnFontAwesomeIcon('remove', 2).' </a>';
     } else {
         $cmd .= '<a onclick="javascript:if(!confirm(\''.get_lang('AreYouSureToDelete').'\')) return false;" href="'.$thisurl.'?what=deleteinstances&vids[]='.$instance->id.'" title="'.$plugin->get_lang('deleteinstances').'">
          &nbsp;'.Display::returnFontAwesomeIcon('remove', 2).' </a>';