Skip to content
Snippets Groups Projects
civicrm.php 44.4 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
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    /**
     *
     * @package CRM
     * @copyright CiviCRM LLC https://civicrm.org/licensing
     *
     */
    
    
    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.
       *
       * @see https://github.com/andy-walker/wp-cli-civicrm
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      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
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * ==============
         * Command for accessing the CiviCRM API. Syntax is identical to `drush cvap`.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm cache-clear
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * ======================
         * Command for accessing clearing cache.  Equivilant of running `civicrm/admin/setting/updateConfigBackend&reset=1`.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm enable-debug
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * =======================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Command for to turn debug on.
         *
         * wp civicrm disable-debug
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * ========================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Command for to turn debug off.
         *
         * wp civicrm member-records
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * =========================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Run the CiviMember UpdateMembershipRecord cron (civicrm member-records).
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * wp civicrm pipe <connection-flags>
         * ==================
         * Start a Civi::pipe session (JSON-RPC 2.0)
         * See https://docs.civicrm.org/dev/en/latest/framework/pipe#flags
         *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * wp civicrm process-mail-queue
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * =============================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * 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
         * ==================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Restore CiviCRM codebase and database back from the specified backup directory.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm sql-conf
         * ===================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Show CiviCRM database connection details.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm sql-connect
         * ======================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * A string which connects to the CiviCRM database.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * 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>...
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * <query> is a SQL statement, which can alternatively be passed via STDIN. Any additional arguments are passed to the mysql command directly.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * wp civicrm update-cfg
         * =====================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Update config_backend to correct config settings, especially when the CiviCRM site has been cloned or migrated.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * 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
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * ==================
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * 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
         * --zipfile           Path to your CiviCRM zip 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;
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // 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',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            'pipe'               => 'pipe',
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            '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 the command.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $command = array_shift($args);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Allow help to pass.
          if ('help' === $command) {
            return;
          }
    
          // Check for existence of CiviCRM (except for command 'install').
          if (!function_exists('civicrm_initialize') && 'install' != $command) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error('Unable to find CiviCRM install.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Check existence of router entry / handler method.
          if (!isset($command_router[$command]) || !method_exists($this, $command_router[$command])) {
            return WP_CLI::error(sprintf('Unrecognized command: %s', $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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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
            //  Input params supplied via json.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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(sprintf('Unknown format: %s', $format));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              break;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
          civicrm_initialize();
    
    
          /*
           * CRM-12523
           * WordPress has it's own timezone calculations. CiviCRM relies on the PHP
           * default timezone which WordPress overrides with UTC in wp-settings.php
           */
          $original_timezone = date_default_timezone_get();
          $wp_site_timezone = $this->getOption('timezone', $this->getTimeZoneString());
          if ($wp_site_timezone) {
            date_default_timezone_set($wp_site_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);
    
          // Restore original timezone.
          if ($original_timezone) {
            date_default_timezone_set($original_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
            // Display output as json.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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(sprintf('Unknown format: %s', $format));
    
        /**
         * Returns the timezone string for the current WordPress site.
         *
         * If a timezone identifier is used, return that.
         * If an offset is used, try to build a suitable timezone.
         * If all else fails, uses UTC.
         *
         * @since 5.64
         *
         * @return string $tzstring The site timezone string.
         */
        private function getTimeZoneString() {
    
          // Return the timezone string when set.
          $tzstring = get_option('timezone_string');
          if (!empty($tzstring)) {
            return $tzstring;
          }
    
          /*
           * Try and build a deprecated (but currently valid) timezone string
           * from the GMT offset value.
           *
           * Note: manual offsets should be discouraged. WordPress works more
           * reliably when setting an actual timezone (e.g. "Europe/London")
           * because of support for Daylight Saving changes.
           *
           * Note: the IANA timezone database that provides PHP's timezone
           * support uses (reversed) POSIX style signs.
           *
           * @see https://www.php.net/manual/en/timezones.others.php
           */
          $offset = get_option('gmt_offset');
          if (0 != $offset && floor($offset) == $offset) {
            $offset_string = $offset > 0 ? "-$offset" : '+' . abs((int) $offset);
            $tzstring = 'Etc/GMT' . $offset_string;
          }
    
          // Default to "UTC" if the timezone string is still empty.
          if (empty($tzstring)) {
            $tzstring = 'UTC';
          }
    
          return $tzstring;
    
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'cache-clear'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        private function cacheClear() {
    
          civicrm_initialize();
          require_once 'CRM/Core/Config.php';
          $config = CRM_Core_Config::singleton();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Clear db caching.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $config->clearDBCache();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // 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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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'.
         *
         * @since 4.7
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        private function install() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ('on' === $this->getOption('ssl', FALSE)) {
            $_SERVER['HTTPS'] = 'on';
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Identify the destination.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
          if ($plugin_path = $this->getOption('destination', FALSE)) {
            $plugin_path = ABSPATH . $plugin_path;
          }
          else {
            $plugin_path = WP_PLUGIN_DIR . '/civicrm';
          }
    
          global $crmPath;
          $crmPath = "$plugin_path/civicrm";
          $crm_files_present = is_dir($crmPath);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Validate install parameters.
    
    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)) {
            $moPath = "$crmPath/l10n/$lang/LC_MESSAGES/civicrm.mo";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if (!($langtarfile = $this->getOption('langtarfile', FALSE)) && !file_exists($moPath)) {
              return WP_CLI::error("Failed to find data for language ($lang). Please download valid language data with --langtarfile=<path/to/tarfile>.");
            }
    
    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.
            // Check anyway 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))) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              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))) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              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 {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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 classloader - so that we can run `Civi\Setup`.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $classLoaderPath = "$crmPath/CRM/Core/ClassLoader.php";
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!file_exists($classLoaderPath)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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
          if ($this->getOption('langtarfile', FALSE)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            if (!$this->untar($plugin_path, 'langtarfile')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
              return WP_CLI::error('Error downloading langtarfile');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if (!empty($lang) && !file_exists($moPath)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error("Failed to find data for language ($lang). Please download valid language data with \"--langtarfile=<path/to/tarfile>\".");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Initialize civicrm-setup
          @WP_CLI::run_command(['plugin', 'activate', 'civicrm'], []);
          require_once $classLoaderPath;
          CRM_Core_ClassLoader::singleton()->register();
          \Civi\Setup::assertProtocolCompatibility(1.0);
          \Civi\Setup::init(['cms' => 'WordPress', 'srcPath' => $crmPath]);
          $setup = \Civi\Setup::instance();
          $setup->getModel()->db = ['server' => $dbhost, 'username' => $dbuser, 'password' => $dbpass, 'database' => $dbname];
          $setup->getModel()->lang = (empty($lang) ? 'en_US' : $lang);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ($base_url = $this->getOption('site_url', FALSE)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $ssl = $this->getOption('ssl', FALSE);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $protocol = ('on' == $ssl ? 'https' : 'http');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            $base_url = $protocol . '://' . $base_url;
            if (substr($base_url, -1) != '/') {
              $base_url .= '/';
            }
            $setup->getModel()->cmsBaseUrl = $base_url;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Check system requirements
          $reqs = $setup->checkRequirements();
          array_map('WP_CLI::print_value', $this->formatRequirements(array_merge($reqs->getErrors(), $reqs->getWarnings())));
          if ($reqs->getErrors()) {
            WP_CLI::error(sprintf("Cannot install. Please check requirements and resolve errors.", count($reqs->getErrors()), count($reqs->getWarnings())));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $installed = $setup->checkInstalled();
          if ($installed->isSettingInstalled() || $installed->isDatabaseInstalled()) {
            WP_CLI::error("Cannot install. CiviCRM has already been installed.");
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Go time
          $setup->installFiles();
          WP_CLI::success('CiviCRM data files initialized successfully.');
          $setup->installDatabase();
          WP_CLI::success('CiviCRM database loaded successfully.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success('CiviCRM installed.');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        private function formatRequirements(array $messages): array {
          $formatted = [];
          foreach ($messages as $message) {
            $formatted[] = sprintf("[%s] %s: %s", $message['severity'], $message['section'], $message['message']);
          }
          return array_unique($formatted);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'member-records'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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';
    
          }
    
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        private function pipe() {
          civicrm_initialize();
          if (!is_callable(['Civi', 'pipe'])) {
            return WP_CLI::error('This version of CiviCRM does not include Civi::pipe() support.');
          }
    
          if (!empty($this->args[1])) {
            Civi::pipe($this->args[1]);
          }
          else {
            Civi::pipe();
          }
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'process-mail-queue'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Adding dummy script, since based on this api file path is computed.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $_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
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'restore'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error('Could not locate the CiviCRM directory inside "restore-dir".');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          }
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          elseif (!file_exists("$code_dir/civicrm/civicrm-version.txt") && !file_exists("$code_dir/civicrm/civicrm-version.php")) {
            return WP_CLI::error('The CiviCRM directory inside "restore-dir" does not seem 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('');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::line(sprintf("Note: Before restoring, a backup will be taken in '%s' directory.", "$restore_backup_dir/plugins/restore"));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error(sprintf('Failed to create directory: %s', $restore_backup_dir));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // 1. Backup and restore codebase.
          WP_CLI::line('Restoring CiviCRM codebase...');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error(sprintf("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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          $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']) && !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']))) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            return WP_CLI::error(sprintf('Could not drop database: %s', $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']))) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            WP_CLI::error(sprintf('Could not create new database: %s', $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.
          WP_CLI::line('Loading "civicrm.sql" file from "restore-dir"...');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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...');
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          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
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'sql-conf'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'sql-connect'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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']) && !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
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'sql-dump'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        private function sqlDump() {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // Bootstrap CiviCRM 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') && !defined('CIVICRM_OLD_DSN')) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Implementation of command 'sql-query'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        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.
            if ($webserver_user && $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'.
         *
         * @since 4.5
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         */
        private function upgrade() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          // TODO: Use wp-cli to download tarfile.
          // TODO: If tarfile is not specified, see if the code already exists and use that instead.
          if (!$this->getOption('tarfile', FALSE) && !$this->getOption('zipfile', FALSE)) {
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
            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(sprintf('Unable to locate settings file at "%s" or at "%s"', $legacy_settings_file, $settings_file));
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          /*
           * We don't want to require "civicrm.settings.php" here, because:
           *
           * a) This is the old environment we're going to replace.
           * b) upgrade-db needs to bootstrap the new environment, so requiring the file
           *    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);