Skip to content
Snippets Groups Projects
civicrm.php 42.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kevin Cristiano's avatar
    Kevin Cristiano committed
    <?php
    /*
     +--------------------------------------------------------------------+
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     | Copyright CiviCRM LLC. All rights reserved.                        |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     |                                                                    |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     | This work is published under the GNU AGPLv3 license with some      |
     | permitted exceptions and without any warranty. For full license    |
     | and copyright information, see https://civicrm.org/licensing       |
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     +--------------------------------------------------------------------+
     */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    if (!defined('CIVICRM_WPCLI_LOADED')) {
      define('CIVICRM_WPCLI_LOADED', 1);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
      /**
       * WP-CLI port of drush-civicrm integration
       * andyw@circle, 08/03/2014
       *
       * Distributed under the GNU Affero General Public License, version 3
       * http://www.gnu.org/licenses/agpl-3.0.html
       */
      class CiviCRM_Command extends WP_CLI_Command {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        private $args;
        private $assoc_args;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        /**
         * WP-CLI integration with CiviCRM.
         *
         * wp civicrm api
         * ===============
         * Command for accessing CiviCRM APIs. Syntax is identical to drush cvap.
         *
         * wp civicrm cache-clear
         * ===============
         * Command for accessing clearing cache.  Equivilant of running civicrm/admin/setting/updateConfigBackend&reset=1
         *
         * wp civicrm enable-debug
         * ===============
         * Command for to turn debug on.
         *
         * wp civicrm disable-debug
         * ===============
         * Command for to turn debug off.
         *
         * wp civicrm member-records
         * ===============
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Run the CiviMember UpdateMembershipRecord cron (civicrm member-records).
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm process-mail-queue
         * ===============
         * Process pending CiviMail mailing jobs.
         * Example:
         * wp civicrm process-mail-queue -u admin
         *
         * wp civicrm rest
         * ===============
         * Rest interface for accessing CiviCRM APIs. It can return xml or json formatted data.
         *
         * wp civicrm restore
         * ==================
         * Restore CiviCRM codebase and database back from the specified backup directory
         *
         * wp civicrm sql-conf
         * ===================
         * Show civicrm database connection details.
         *
         * wp civicrm sql-connect
         * ======================
         * A string which connects to the civicrm database.
         *
         * wp civicrm sql-cli
         * ==================
         * Quickly enter the mysql command line.
         *
         * wp civicrm sql-dump
         * ===================
         * Prints the whole CiviCRM database to STDOUT or save to a file.
         *
         * wp civicrm sql-query
         * ====================
         * Usage: wp civicrm sql-query <query> <options>...
         * <query> is a SQL statement, which can alternatively be passed via STDIN. Any additional arguments are passed to the mysql command directly.";
         *
         * wp civicrm update-cfg
         * =====================
         * Update config_backend to correct config settings, especially when the CiviCRM site has been cloned / migrated.
         *
         * wp civicrm upgrade
         * ==================
         * Take backups, replace CiviCRM codebase with new specified tarfile and upgrade database by executing the CiviCRM upgrade process - civicrm/upgrade?reset=1. Use civicrm-restore to revert to previous state in case anything goes wrong.
         *
         * wp civicrm upgrade-db
         * =====================
         * Run civicrm/upgrade?reset=1 just as a web browser would.
         *
         * wp civicrm install
         * ===============
         * Command for to install CiviCRM.  The install command requires that you have downloaded a tarball or zip file first.
         * Options:
         * --dbhost            MySQL host for your WordPress/CiviCRM database. Defaults to localhost.
         * --dbname            MySQL database name of your WordPress/CiviCRM database.
         * --dbpass            MySQL password for your WordPress/CiviCRM database.
         * --dbuser            MySQL username for your WordPress/CiviCRM database.
         * --lang              Default language to use for installation.
         * --langtarfile       Path to your l10n tar.gz file.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * --site_url          Base Url for your WordPress/CiviCRM website without http (e.g. mysite.com)
         * --ssl               Using ssl for your WordPress/CiviCRM website if set to on (e.g. --ssl=on)
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * --tarfile           Path to your CiviCRM tar.gz file.
         *
         */
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        public function __invoke($args, $assoc_args) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          $this->args       = $args;
          $this->assoc_args = $assoc_args;
    
          # define command router
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command_router = [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'api'                => 'api',
            'cache-clear'        => 'cacheClear',
            'enable-debug'       => 'enableDebug',
            'disable-debug'      => 'disableDebug',
            'install'            => 'install',
            'member-records'     => 'memberRecords',
            'process-mail-queue' => 'processMailQueue',
            'rest'               => 'rest',
            'restore'            => 'restore',
            'sql-cli'            => 'sqlCLI',
            'sql-conf'           => 'sqlConf',
            'sql-connect'        => 'sqlConnect',
            'sql-dump'           => 'sqlDump',
            'sql-query'          => 'sqlQuery',
            'update-cfg'         => 'updateConfig',
            'upgrade'            => 'upgrade',
            'upgrade-db'         => 'upgradeDB',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # get command
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command = array_shift($args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # check for existence of Civi (except for command 'install')
          if (!function_exists('civicrm_initialize') and 'install' != $command) {
            return WP_CLI::error('Unable to find CiviCRM install.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # check existence of router entry / handler method
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!isset($command_router[$command]) or !method_exists($this, $command_router[$command])) {
            return WP_CLI::error("Unrecognized command - '$command'");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # run command
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return $this->{$command_router[$command]}();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        }
    
        /**
         * Implementation of command 'api'
         */
        private function api() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $defaults = ['version' => 3];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          array_shift($this->args);
          list($entity, $action) = explode('.', $this->args[0]);
          array_shift($this->args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # parse $params
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $format = $this->getOption('in', 'args');
          switch ($format) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
            # input params supplied via args ..
            case 'args':
              $params = $defaults;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              foreach ($this->args as $arg) {
                preg_match('/^([^=]+)=(.*)$/', $arg, $matches);
                $params[$matches[1]] = $matches[2];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              }
              break;
    
            # input params supplied via json ..
            case 'json':
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $json   = stream_get_contents(STDIN);
              $params = (empty($json) ? $defaults : array_merge($defaults, json_decode($json, TRUE)));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              break;
    
            default:
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              WP_CLI::error('Unknown format: ' . $format);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              break;
          }
    
          civicrm_initialize();
    
          // CRM-18062: Set CiviCRM timezone if any
          $wp_base_timezone = date_default_timezone_get();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $wp_user_timezone = $this->getOption('timezone', get_option('timezone_string'));
          if ($wp_user_timezone) {
            date_default_timezone_set($wp_user_timezone);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $result = civicrm_api($entity, $action, $params);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          // restore WP's timezone
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($wp_base_timezone) {
            date_default_timezone_set($wp_base_timezone);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          switch ($this->getOption('out', 'pretty')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            # pretty-print output (default)
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            case 'pretty':
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              WP_CLI::line(print_r($result, TRUE));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              break;
    
            # display output as json
            case 'json':
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              WP_CLI::line(json_encode($result));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              break;
    
            default:
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              return WP_CLI::error('Unknown format: ' . $format);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          }
    
        }
    
        /**
         * Implementation of command 'cache-clear'
         */
        private function cacheClear() {
    
          civicrm_initialize();
          require_once 'CRM/Core/Config.php';
          $config = CRM_Core_Config::singleton();
    
          # clear db caching
          $config->clearDBCache();
    
          # also cleanup the templates_c directory
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $config->cleanup(1, FALSE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # also cleanup the session object
          $session = CRM_Core_Session::singleton();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $session->reset(1);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        }
    
        /**
         * Implementation of command 'enable-debug'
         */
        private function enableDebug() {
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          Civi::settings()->add([
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'debug_enabled' => 1,
            'backtrace' => 1,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ]);
          WP_CLI::success('Debug setting enabled.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
        /**
         * Implementation of command 'disable-debug'
         */
        private function disableDebug() {
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          Civi::settings()->add([
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'debug_enabled' => 0,
            'backtrace' => 0,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ]);
          WP_CLI::success('Debug setting disabled.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        }
    
        /**
         * Implementation of command 'install'
         */
        private function install() {
    
          # validate
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$dbuser = $this->getOption('dbuser', FALSE)) {
            return WP_CLI::error('CiviCRM database username not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$dbpass = $this->getOption('dbpass', FALSE)) {
            return WP_CLI::error('CiviCRM database password not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$dbhost = $this->getOption('dbhost', FALSE)) {
            return WP_CLI::error('CiviCRM database host not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$dbname = $this->getOption('dbname', FALSE)) {
            return WP_CLI::error('CiviCRM database name not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($lang = $this->getOption('lang', FALSE) and !$langtarfile = $this->getOption('langtarfile', FALSE)) {
            return WP_CLI::error('CiviCRM language tarfile not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # begin install
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($plugin_path = $this->getOption('destination', FALSE)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $plugin_path = ABSPATH . $plugin_path;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $plugin_path = WP_PLUGIN_DIR . '/civicrm';
          }
    
          global $crmPath;
          $crmPath = "$plugin_path/civicrm";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $crm_files_present = is_dir($crmPath);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # extract the archive
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($this->getOption('tarfile', FALSE)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            # should probably never get to here as Wordpress Civi comes in a zip file, but
            # just in case that ever changes ..
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if ($crm_files_present) {
              return WP_CLI::error('Existing CiviCRM found. No action taken.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if (!$this->untar(dirname($plugin_path))) {
              return WP_CLI::error('Error extracting tarfile');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          elseif ($this->getOption('zipfile', FALSE)) {
            if ($crm_files_present) {
              return WP_CLI::error('Existing CiviCRM found. No action taken.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if (!$this->unzip(dirname($plugin_path))) {
              return WP_CLI::error('Error extracting zipfile');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          elseif ($crm_files_present) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // Site is already extracted (which is how we're running this
            // script); we just need to run the installer.
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          else {
            return WP_CLI::error('No zipfile specified, use --zipfile=path/to/zipfile or extract file ahead of time');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # include civicrm installer helper file
          $civicrm_installer_helper = "$crmPath/install/civicrm.php";
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($civicrm_installer_helper)) {
            return WP_CLI::error('Archive could not be unpacked or CiviCRM installer helper file is missing.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($crm_files_present) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // We were using a directory that was already there.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            WP_CLI::success('Using installer files found on the site.');
          }
          else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            // We must've just unpacked the archive because it wasn't there
            // before.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            WP_CLI::success('Archive unpacked.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          require_once $civicrm_installer_helper;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ('' != $lang) {
            if (!$this->untar($plugin_path, 'langtarfile')) {
              return WP_CLI::error('No language tarfile specified, use --langtarfile=path/to/tarfile');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            }
          }
    
          # create files dirs
          $upload_dir = wp_upload_dir();
          $settings_dir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_setup($upload_dir['basedir'] . DIRECTORY_SEPARATOR);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::launch("chmod -R 0755 " . escapeshellarg($settings_dir));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # now we've got some files in place, require PEAR DB and check db setup
          $dsn = "mysql://{$dbuser}:{$dbpass}@{$dbhost}/{$dbname}?new_link=true";
          $dsn_nodb = "mysql://{$dbuser}:{$dbpass}@{$dbhost}";
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('DB_DSN_MODE')) {
            define('DB_DSN_MODE', 'auto');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          include_once "$crmPath/vendor/pear/db/DB.php";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $db = DB::connect($dsn);
          if (DB::iserror($db)) {
            $db = DB::connect($dsn_nodb);
            if (DB::iserror($db)) {
              return WP_CLI::error('Unable to connect to database. Please re-check credentials.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $db->query("CREATE DATABASE $dbname");
            if (DB::iserror($db)) {
              return WP_CLI::error('CiviCRM database was not found. Failed to create one.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            }
            $db->disconnect();
          }
    
          # install db
          global $sqlPath;
    
          # setup database with civicrm structure and data
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line('Loading CiviCRM database structure ..');
          civicrm_source($dsn, $sqlPath . '/civicrm.mysql');
          WP_CLI::line('Loading CiviCRM database with required data ..');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # testing the translated sql files availability
          $data_file = $sqlPath . '/civicrm_data.mysql';
          $acl_file  = $sqlPath . '/civicrm_acl.mysql';
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ('' != $lang) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if (file_exists($sqlPath . '/civicrm_data.' . $lang . '.mysql')
              and file_exists($sqlPath . '/civicrm_acl.' . $lang . '.mysql')
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              and '' != $lang
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            ) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $data_file = $sqlPath . '/civicrm_data.' . $lang . '.mysql';
              $acl_file = $sqlPath . '/civicrm_acl.' . $lang . '.mysql';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            }
            else {
              WP_CLI::warning("No sql files could be retrieved for '$lang' using default language.");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_source($dsn, $data_file);
          civicrm_source($dsn, $acl_file);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('CiviCRM database loaded successfully.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # generate civicrm.settings.php file
          global $tplPath;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($tplPath . 'civicrm.settings.php.template')) {
            return WP_CLI::error('Could not find CiviCRM settings template and therefore could not create settings file.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line('Generating civicrm settings file ..');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($base_url = $this->getOption('site_url', FALSE)) {
            $ssl      = $this->getOption('ssl', FALSE);
            $protocol = ('on' == $ssl ? 'https' : 'http');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $base_url = !$base_url ? get_bloginfo('url') : $protocol . '://' . $base_url;
          if (substr($base_url, -1) != '/') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $base_url .= '/';
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $params = [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'crmRoot'            => $crmPath . '/',
            'templateCompileDir' => "{$settings_dir}templates_c",
            'frontEnd'           => 0,
            'cms'                => 'WordPress',
            'baseURL'            => $base_url,
            'dbUser'             => $dbuser,
            'dbPass'             => $dbpass,
            'dbHost'             => $dbhost,
            'dbName'             => $dbname,
            'CMSdbUser'          => DB_USER,
            'CMSdbPass'          => DB_PASSWORD,
            'CMSdbHost'          => DB_HOST,
            'CMSdbName'          => DB_NAME,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'siteKey'            => preg_replace(';[^a-zA-Z0-9];', '', base64_encode(random_bytes(37))),
            'credKeys'           => 'aes-cbc:hkdf-sha256:' . preg_replace(';[^a-zA-Z0-9];', '', base64_encode(random_bytes(37))),
            'signKeys'           => 'jwt-hs256:hkdf-sha256:' . preg_replace(';[^a-zA-Z0-9];', '', base64_encode(random_bytes(37))),
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $str = file_get_contents($tplPath . 'civicrm.settings.php.template');
          foreach ($params as $key => $value) {
            $str = str_replace('%%' . $key . '%%', $value, $str);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $str = trim($str);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          $config_file = "{$settings_dir}civicrm.settings.php";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_write_file($config_file, $str);
          WP_CLI::launch("chmod 0644 $config_file");
          WP_CLI::success(sprintf('Settings file generated: %s', $config_file));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          # activate plugin and we're done
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          @WP_CLI::run_command(['plugin', 'activate', 'civicrm'], []);
          WP_CLI::success('CiviCRM installed.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        }
    
        /**
         * Implementation of command 'member-records'
         */
        private function memberRecords() {
    
          civicrm_initialize();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (substr(CRM_Utils_System::version(), 0, 3) >= '4.3') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
            $job = new CRM_Core_JobManager();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $job->executeJobByAction('job', 'process_membership');
            WP_CLI::success("Executed 'process_membership' job.");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $_REQUEST['name'] = $this->getOption('civicrm_cron_username', NULL);
            $_REQUEST['pass'] = $this->getOption('civicrm_cron_password', NULL);
            $_REQUEST['key']  = $this->getOption('civicrm_sitekey', NULL);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
            global $argv;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $argv = [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              0 => 'drush',
              1 => '-u' . $_REQUEST['name'],
              2 => '-p' . $_REQUEST['pass'],
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              3 => '-s' . $this->getOption('uri', FALSE),
            ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            # if (!defined('CIVICRM_CONFDIR')) {
            # $plugins_dir = plugin_dir_path(__FILE__);
            #     define('CIVICRM_CONFDIR', $plugins_dir);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            # }
    
            include 'bin/UpdateMembershipRecord.php';
    
          }
    
        }
    
        /**
         * Implementation of command 'process-mail-queue'
         */
        private function processMailQueue() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (substr(CRM_Utils_System::version(), 0, 3) >= '4.3') {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
            $job = new CRM_Core_JobManager();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $job->executeJobByAction('job', 'process_mailing');
            WP_CLI::success("Executed 'process_mailing' job.");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          else {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $result = civicrm_api('Mailing', 'Process', ['version' => 3]);
            if ($result['is_error']) {
              WP_CLI::error($result['error_message']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            }
          }
    
        }
    
        /**
         * Implementation of command 'rest'
         */
        private function rest() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$query = $this->getOption('query', FALSE)) {
            return WP_CLI::error('query not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $query     = explode('&', $query);
          $_GET['q'] = array_shift($query);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          foreach ($query as $key_val) {
            list($key, $val) = explode('=', $key_val);
            $_REQUEST[$key]  = $val;
            $_GET[$key]      = $val;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          require_once 'CRM/Utils/REST.php';
          $rest = new CRM_Utils_REST();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          require_once 'CRM/Core/Config.php';
          $config = CRM_Core_Config::singleton();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          global $civicrm_root;
          // adding dummy script, since based on this api file path is computed.
          $_SERVER['SCRIPT_FILENAME'] = "$civicrm_root/extern/rest.php";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (isset($_GET['json']) && $_GET['json']) {
            header('Content-Type: text/javascript');
          }
          else {
            header('Content-Type: text/xml');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          echo $rest->run($config);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Implementation of command 'restore'
         */
        private function restore() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # validate ..
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $restore_dir = $this->getOption('restore-dir', FALSE);
          $restore_dir = rtrim($restore_dir, '/');
          if (!$restore_dir) {
            return WP_CLI::error('Restore-dir not specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $sql_file = $restore_dir . '/civicrm.sql';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($sql_file)) {
            return WP_CLI::error('Could not locate civicrm.sql file in the restore directory.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $code_dir = $restore_dir . '/civicrm';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!is_dir($code_dir)) {
            return WP_CLI::error('Could not locate civicrm directory inside restore-dir.');
          }
          elseif (!file_exists("$code_dir/civicrm/civicrm-version.txt") and !file_exists("$code_dir/civicrm/civicrm-version.php")) {
            return WP_CLI::error('civicrm directory inside restore-dir, doesn\'t look to be a valid civicrm codebase.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # prepare to restore ..
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $date = date('YmdHis');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_initialize();
          global $civicrm_root;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $civicrm_root_base = explode('/', $civicrm_root);
          array_pop($civicrm_root_base);
          $civicrm_root_base = implode('/', $civicrm_root_base) . '/';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $basepath = explode('/', $civicrm_root);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!end($basepath)) {
            array_pop($basepath);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          array_pop($basepath);
          $project_path = implode('/', $basepath) . '/';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $wp_root = ABSPATH;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $restore_backup_dir = $this->getOption('backup-dir', $wp_root . '/../backup');
          $restore_backup_dir = rtrim($restore_backup_dir, '/');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # get confirmation from user -
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN')) {
            WP_CLI::error('CIVICRM_DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $db_spec = DB::parseDSN(CIVICRM_DSN);
          WP_CLI::line('');
          WP_CLI::line('Process involves:');
          WP_CLI::line(sprintf("1. Restoring '\$restore-dir/civicrm' directory to '%s'.", $civicrm_root_base));
          WP_CLI::line(sprintf("2. Dropping and creating '%s' database.", $db_spec['database']));
          WP_CLI::line("3. Loading '\$restore-dir/civicrm.sql' file into the database.");
          WP_CLI::line('');
          WP_CLI::line(sprintf("Note: Before restoring a backup will be taken in '%s' directory.", "$restore_backup_dir/plugins/restore"));
          WP_CLI::line('');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::confirm('Do you really want to continue?');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $restore_backup_dir .= '/plugins/restore/' . $date;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!mkdir($restore_backup_dir, 0755, TRUE)) {
            return WP_CLI::error('Failed creating directory: ' . $restore_backup_dir);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # 1. backup and restore codebase
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line('Restoring civicrm codebase ..');
          if (is_dir($project_path) && !rename($project_path, $restore_backup_dir . '/civicrm')) {
            return WP_CLI::error(sprintf("Failed to take backup for '%s' directory", $project_path));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!rename($code_dir, $project_path)) {
            return WP_CLI::error("Failed to restore civicrm directory '%s' to '%s'", $code_dir, $project_path);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Codebase restored.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # 2. backup, drop and create database
          WP_CLI::run_command(
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            ['civicrm', 'sql-dump'],
            ['result-file' => $restore_backup_dir . '/civicrm.sql']
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Database backed up.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # prepare a mysql command-line string for issuing
          # db drop / create commands
          $command = sprintf(
            'mysql --user=%s --password=%s',
            $db_spec['username'],
            $db_spec['password']
          );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (isset($db_spec['hostspec'])) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $command .= ' --host=' . $db_spec['hostspec'];
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (isset($dsn['port']) and !mpty($dsn['port'])) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $command .= ' --port=' . $db_spec['port'];
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # attempt to drop old database
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (system($command . sprintf(' --execute="DROP DATABASE IF EXISTS %s"', $db_spec['database']))) {
            return WP_CLI::error('Could not drop database: ' . $db_spec['database']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Database dropped.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # attempt to create new database
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (system($command . sprintf(' --execute="CREATE DATABASE %s"', $db_spec['database']))) {
            WP_CLI::error('Could not create new database: ' . $db_spec['database']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Database created.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # 3. restore database
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line('Loading civicrm.sql file from restore-dir ..');
          system($command . ' ' . $db_spec['database'] . ' < ' . $sql_file);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Database restored.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line('Clearing caches..');
          WP_CLI::run_command(['civicrm', 'cache-clear']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('Restore process completed.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Implementation of command 'sql-conf'
         */
        private function sqlConf() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN')) {
            WP_CLI::error('CIVICRM_DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line(print_r(DB::parseDSN(CIVICRM_DSN), TRUE));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Implementation of command 'sql-connect'
         */
        private function sqlConnect() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN')) {
            return WP_CLI::error('CIVICRM_DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $dsn = DB::parseDSN(CIVICRM_DSN);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command = sprintf(
            'mysql --database=%s --host=%s --user=%s --password=%s',
            $dsn['database'],
            $dsn['hostspec'],
            $dsn['username'],
            $dsn['password']
          );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (isset($dsn['port']) and !empty($dsn['port'])) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $command .= ' --port=' . $dsn['port'];
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          return WP_CLI::line($command);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Implementation of command 'sql-dump'
         */
        private function sqlDump() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # bootstrap Civi when we're not being called as part of an upgrade
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_UPGRADE_ACTIVE')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            civicrm_initialize();
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN') and !defined('CIVICRM_OLD_DSN')) {
            WP_CLI::error('DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $dsn = self::parseDSN(defined('CIVICRM_DSN') ? CIVICRM_DSN : CIVICRM_OLD_DSN);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $assoc_args       = $this->assoc_args;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $stdout           = !isset($assoc_args['result-file']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command          = "mysqldump --no-defaults --host={$dsn['hostspec']} --user={$dsn['username']} --password='{$dsn['password']}' %s";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command_esc_args = [$dsn['database']];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (isset($assoc_args['tables'])) {
            $tables = explode(',', $assoc_args['tables']);
            unset($assoc_args['tables']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $command .= ' --tables';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            foreach ($tables as $table) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $command .= ' %s';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $command_esc_args[] = trim($table);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $escaped_command = call_user_func_array(
            '\WP_CLI\Utils\esc_cmd',
            array_merge(
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              [$command],
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $command_esc_args
            )
          );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          \WP_CLI\Utils\run_mysql_command($escaped_command, $assoc_args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$stdout) {
            WP_CLI::success(sprintf('Exported to %s', $assoc_args['result-file']));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
         * Implementation of command 'sql-query'
         */
        private function sqlQuery() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!isset($this->args[0])) {
            WP_CLI::error('No query specified.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return;
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $query = $this->args[0];
    
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN')) {
            WP_CLI::error('CIVICRM_DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $dsn = DB::parseDSN(CIVICRM_DSN);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $mysql_args = [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'host'     => $dsn['hostspec'],
            'database' => $dsn['database'],
            'user'     => $dsn['username'],
            'password' => $dsn['password'],
            'execute'  => $query,
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          \WP_CLI\Utils\run_mysql_command('mysql --no-defaults', $mysql_args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        }
    
        /**
         * Implementation of command 'sql-cli'
         */
        private function sqlCLI() {
    
          civicrm_initialize();
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_DSN')) {
            WP_CLI::error('CIVICRM_DSN is not defined.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $dsn = DB::parseDSN(CIVICRM_DSN);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $mysql_args = [
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'host'     => $dsn['hostspec'],
            'database' => $dsn['database'],
            'user'     => $dsn['username'],
            'password' => $dsn['password'],
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          ];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          \WP_CLI\Utils\run_mysql_command('mysql --no-defaults', $mysql_args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        }
    
        /**
         * Implementation of command 'update-cfg'
         */
        private function updateConfig() {
    
          civicrm_initialize();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $default_values = [];
          $states         = ['old', 'new'];
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          for ($i = 1; $i <= 3; $i++) {
            foreach ($states as $state) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $name = "{$state}Val_{$i}";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $value = $this->getOption($name, NULL);
              if ($value) {
                $default_values[$name] = $value;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              }
            }
          }
    
          $webserver_user  = $this->getWebServerUser();
          $webserver_group = $this->getWebServerGroup();
    
          require_once 'CRM/Core/I18n.php';
          require_once 'CRM/Core/BAO/ConfigSetting.php';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $result = CRM_Core_BAO_ConfigSetting::doSiteMove($default_values);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($result) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
            # attempt to preserve webserver ownership of templates_c, civicrm/upload
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if ($webserver_user and $webserver_group) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              $upload_dir      = wp_upload_dir();
              $civicrm_files_dir      = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              system(sprintf('chown -R %s:%s %s/templates_c', $webserver_user, $webserver_group, $civicrm_files_dir));
              system(sprintf('chown -R %s:%s %s/upload', $webserver_user, $webserver_group, $civicrm_files_dir));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            WP_CLI::success('Config successfully updated.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
          else {
            WP_CLI::error('Config update failed.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
        }
    
        /**
         * Implementation of command 'upgrade'
         */
        private function upgrade() {
    
          # todo: use wp-cli to download tarfile.
          # todo: if tarfile is not specified, see if the code already exists and use that instead.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!$this->getOption('tarfile', FALSE) and !$this->getOption('zipfile', FALSE)) {
            return WP_CLI::error('Must specify either --tarfile or --zipfile');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # fixme: throw error if tarfile is not in a valid format.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_UPGRADE_ACTIVE')) {
            define('CIVICRM_UPGRADE_ACTIVE', 1);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          $wp_root       = ABSPATH;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $plugins_dir = plugin_dir_path(__FILE__);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $legacy_settings_file = $plugins_dir . '/civicrm.settings.php';
          $upload_dir      = wp_upload_dir();
          $settings_file     = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm.settings.php';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($legacy_settings_file) && !file_exists($settings_file)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error('Unable to locate settings file at ' . $legacy_settings_file . 'or at ' . $settings_file);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          # nb: we don't want to require civicrm.settings.php here, because ..
          #
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          # a) this is the old environment we're going to replace
          # b) upgrade-db needs to bootstrap the new environment, so requiring the file
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          #    now will create multiple inclusion problems later on
          #
          # however, all we're really after is $civicrm_root and CIVICRM_DSN, so we're going to
          # pull out the lines we need using a regex and run them - yes, it's pretty silly ..
          # don't try this at home, kids.
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $legacy_settings = file_get_contents($legacy_settings_file);
          $legacy_settings = str_replace("\r", '', $legacy_settings);
          $legacy_settings = explode("\n", $legacy_settings);
          $settings = file_get_contents($settings_file);
          $settings = str_replace("\r", '', $settings);
          $settings = explode("\n", $settings);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($civicrm_root_code = reset(preg_grep('/^\s*\$civicrm_root\s*=.*$/', $legacy_settings))) {
            // phpcs:disable
            eval($civicrm_root_code);
            // phpcs:enable
          }
          elseif ($civicrm_root_code = reset(preg_grep('/^\s*\$civicrm_root\s*=.*$/', $settings))) {
            // phpcs:disable
            eval($civicrm_root_code);
            // phpcs:enable
          }
          else {
            return WP_CLI::error('Unable to read $civicrm_root from civicrm.settings.php');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($civicrm_dsn_code = reset(preg_grep('/^\s*define.*CIVICRM_DSN.*$/', $settings))) {
            $civicrm_dsn_code = str_replace('CIVICRM_DSN', 'CIVICRM_OLD_DSN', $civicrm_dsn_code);
            // phpcs:disable
            eval($civicrm_dsn_code);
            // phpcs:enable
          }
          else {
            return WP_CLI::error('Unable to read CIVICRM_DSN from civicrm.settings.php');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!defined('CIVICRM_OLD_DSN')) {
            return WP_CLI::error('Unable to set CIVICRM_OLD_DSN');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $date        = date('YmdHis');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $backup_file = 'civicrm';
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $basepath = explode('/', $civicrm_root);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!end($basepath)) {
            array_pop($basepath);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          array_pop($basepath);
          $project_path = implode('/', $basepath) . '/';
          array_pop($basepath);
          $plugin_path = implode('/', $basepath) . '/';
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $backup_dir = $this->getOption('backup-dir', $wp_root . '../backup');
          $backup_dir = rtrim($backup_dir, '/');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line("\nThe upgrade process involves - ");
          WP_CLI::line(sprintf('1. Backing up current CiviCRM code as => %s', "$backup_dir/plugins/$date/$backup_file"));
          WP_CLI::line(sprintf('2. Backing up database as => %s', "$backup_dir/plugins/$date/$backup_file.sql"));
          WP_CLI::line(sprintf('3. Unpacking tarfile to => %s', $plugin_path));
          WP_CLI::line("4. Executing civicrm/upgrade?reset=1 just as a browser would.\n");