Skip to content
Snippets Groups Projects
civicrm.php 43.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kevin Cristiano's avatar
    Kevin Cristiano committed
          WP_CLI::success( '1. Code backed up.' );
    
          WP_CLI::run_command(
            array( 'civicrm', 'sql-dump' ),
            array( 'result-file' => $backup_target . '.sql' )
          );
    
          WP_CLI::success( '2. Database backed up.' );
    
          # decompress
          if ( $this->getOption( 'tarfile', false ) ) {
            # should probably never get to here, as looks like Wordpress Civi comes
            # in a zip file
            if ( ! $this->untar( $plugin_path ) ) {
              return WP_CLI::error( 'Error extracting tarfile' );
            }
          } elseif ( $this->getOption( 'zipfile', false ) ) {
            if ( ! $this->unzip( $plugin_path ) ) {
              return WP_CLI::error( 'Error extracting zipfile' );
            }
          } else {
            return WP_CLI::error( 'No zipfile specified, use --zipfile=path/to/zipfile' );
          }
    
          WP_CLI::success( '3. Archive unpacked.' );
    
          WP_CLI::line( 'Copying civicrm.settings.php to ' . $project_path . '..' );
          define( 'CIVICRM_SETTINGS_PATH', $project_path . 'civicrm.settings.php' );
    
          if ( ! copy( $backup_dir . '/civicrm/civicrm.settings.php', CIVICRM_SETTINGS_PATH ) ) {
            return WP_CLI::error( 'Failed to copy file' );
          }
    
          WP_CLI::success( '4. ' );
    
          WP_CLI::run_command( array( 'civicrm', 'upgrade-db' ), array() );
    
          WP_CLI::success( 'Process completed.' );
    
        }
    
        /**
         * Implementation of command 'upgrade-db'
         */
        private function upgradeDB() {
    
          civicrm_initialize();
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ( ! defined( 'CIVICRM_UPGRADE_ACTIVE' ) ) {
            define( 'CIVICRM_UPGRADE_ACTIVE', 1 );
          }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
          if ( class_exists( 'CRM_Upgrade_Headless' ) ) {
            # Note: CRM_Upgrade_Headless introduced in 4.2 -- at the same time as class auto-loading
            try {
              $upgrade_headless = new CRM_Upgrade_Headless();
              $result = $upgrade_headless->run();
              WP_CLI::line( 'Upgrade outputs: ' . '"' . $result['message'] . '"' );
            } catch ( Exception $e ) {
              WP_CLI::error( $e->getMessage() );
            }
    
          } else {
    
            require_once 'CRM/Core/Smarty.php';
            $template = CRM_Core_Smarty::singleton();
    
            require_once( 'CRM/Upgrade/Page/Upgrade.php' );
            $upgrade = new CRM_Upgrade_Page_Upgrade();
    
            // new since CiviCRM 4.1
            if ( is_callable( array( $upgrade, 'setPrint' ) ) ) {
              $upgrade->setPrint( true );
            }
    
            # to suppress html output /w source code.
            ob_start();
            $upgrade->run();
            # capture the required message.
            $result = $template->get_template_vars( 'message' );
            ob_end_clean();
            WP_CLI::line( 'Upgrade outputs: ' . "\"$result\"" );
    
          }
    
        }
    
        /**
         * DSN parser - this has been stolen from PEAR DB since we don't always have a
         * bootstrapped environment we can access this from, eg: when doing an upgrade
         * @param  $dsn ( string )
         * @return array containing db connection details
         */
        private static function parseDSN( $dsn ) {
    
          $parsed = array(
            'phptype'  => false,
            'dbsyntax' => false,
            'username' => false,
            'password' => false,
            'protocol' => false,
            'hostspec' => false,
            'port'     => false,
            'socket'   => false,
            'database' => false,
           );
    
          if ( is_array( $dsn ) ) {
            $dsn = array_merge( $parsed, $dsn );
            if ( ! $dsn['dbsyntax'] ) {
              $dsn['dbsyntax'] = $dsn['phptype'];
            }
            return $dsn;
          }
    
          // Find phptype and dbsyntax
          if ( ( $pos = strpos( $dsn, '://' ) ) !== false ) {
            $str = substr( $dsn, 0, $pos );
            $dsn = substr( $dsn, $pos + 3 );
          } else {
            $str = $dsn;
            $dsn = null;
          }
    
          // Get phptype and dbsyntax
          // $str => phptype( dbsyntax )
          if ( preg_match( '|^(.+?)\((.*?)\)$|', $str, $arr ) ) {
            $parsed['phptype']  = $arr[1];
            $parsed['dbsyntax'] = ! $arr[2] ? $arr[1] : $arr[2];
          } else {
            $parsed['phptype']  = $str;
            $parsed['dbsyntax'] = $str;
          }
    
          if ( empty( $dsn ) ) {
            return $parsed;
          }
    
          // Get ( if found ): username and password
          // $dsn => username:password@protocol+hostspec/database
          if ( ( $at = strrpos( $dsn,'@' ) ) !== false ) {
            $str = substr( $dsn, 0, $at );
            $dsn = substr( $dsn, $at + 1 );
            if ( ( $pos = strpos( $str, ':' ) ) !== false ) {
              $parsed['username'] = rawurldecode( substr( $str, 0, $pos ) );
              $parsed['password'] = rawurldecode( substr( $str, $pos + 1 ) );
            } else {
              $parsed['username'] = rawurldecode( $str );
            }
          }
    
          // Find protocol and hostspec
    
          if ( preg_match( '|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match ) ) {
            // $dsn => proto( proto_opts )/database
            $proto       = $match[1];
            $proto_opts  = $match[2] ? $match[2] : false;
            $dsn         = $match[3];
    
          } else {
            // $dsn => protocol+hostspec/database ( old format )
            if ( strpos( $dsn, '+' ) !== false ) {
              list( $proto, $dsn ) = explode( '+', $dsn, 2 );
            }
            if ( strpos( $dsn, '/' ) !== false ) {
              list( $proto_opts, $dsn ) = explode( '/', $dsn, 2 );
            } else {
              $proto_opts = $dsn;
              $dsn = null;
            }
          }
    
          // process the different protocol options
          $parsed['protocol'] = ( ! empty( $proto ) ) ? $proto : 'tcp';
          $proto_opts = rawurldecode( $proto_opts );
          if ( strpos( $proto_opts, ':' ) !== false ) {
            list( $proto_opts, $parsed['port'] ) = explode( ':', $proto_opts );
          }
          if ( 'tcp' == $parsed['protocol'] ) {
            $parsed['hostspec'] = $proto_opts;
          } elseif ( 'unix' == $parsed['protocol'] ) {
            $parsed['socket'] = $proto_opts;
          }
    
          // Get dabase if any
          // $dsn => database
          if ( $dsn ) {
            if ( ( $pos = strpos( $dsn, '?' ) ) === false ) {
              // /database
              $parsed['database'] = rawurldecode( $dsn );
            } else {
              // /database?param1=value1&param2=value2
              $parsed['database'] = rawurldecode( substr( $dsn, 0, $pos ) );
              $dsn = substr( $dsn, $pos + 1 );
              if ( strpos( $dsn, '&' ) !== false ) {
                $opts = explode( '&', $dsn );
              } else { // database?param1=value1
                $opts = array( $dsn );
              }
              foreach ( $opts as $opt ) {
                list( $key, $value ) = explode( '=', $opt );
                if ( ! isset( $parsed[ $key ] ) ) {
                  // don't allow params overwrite
                  $parsed[ $key ] = rawurldecode( $value );
                }
              }
            }
          }
    
          return $parsed;
        }
    
        /**
         * Helper function to replicate functionality of drush_get_option
         * @param  $name ( string )
         * @return mixed - value if found or $default
         */
        private function getOption( $name, $default ) {
          return isset( $this->assoc_args[ $name ] ) ? $this->assoc_args[ $name ] : $default;
        }
    
        /**
         * Get the user the web server runs as, used to preserve file permissions on templates_c, civicrm/upload
         * etc when running as root. This is not a very good check, but is good enough for what we want to do,
         * which is preserve file permissions
         * @return string - the user which owns templates_c / empty string if not found
         */
        private function getWebServerUser() {
          $plugins_dir = plugin_dir_path( __FILE__ );
          $plugins_dir_root = WP_PLUGIN_DIR;
          $upload_dir      = wp_upload_dir();
          $tpl_path     = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'templates_c';
          $legacy_tpl_path = $plugins_dir_root . '/files/civicrm/templates_c';
          if ( is_dir( $legacy_tpl_path ) ) {
            $owner = posix_getpwuid( fileowner( $legacy_tpl_path ) );
            if ( isset( $owner['name'] ) ) {
              return $owner['name'];
            }
          } elseif ( is_dir( $tpl_path ) ) {
            $owner = posix_getpwuid( fileowner( $tpl_path ) );
            if ( isset( $owner['name'] ) ) {
              return $owner['name'];
            }
          }
          return '';
    
        }
    
        /**
         * Get the group the webserver runs as - as above, but for group
         */
        private function getWebServerGroup() {
          $plugins_dir = plugin_dir_path( __FILE__ );
          $plugins_dir_root = WP_PLUGIN_DIR;
          $upload_dir      = wp_upload_dir();
          $tpl_path     = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'templates_c';
          $legacy_tpl_path = $plugins_dir_root . '/files/civicrm/templates_c';
          if ( is_dir( $legacy_tpl_path ) ) {
            $group = posix_getgrgid( filegroup( $legacy_tpl_path ) );
            if ( isset( $group['name'] ) ) {
              return $group['name'];
            }
          } elseif ( is_dir( $tpl_path ) ) {
            $group = posix_getgrgid( filegroup( $tpl_path ) );
            if ( isset( $group['name'] ) ) {
              return $group['name'];
            }
          }
          return '';
    
        }
    
        /**
         * Extract a tar.gz archive
         * @param  $destination_path - the path to extract to
         * @param  $option          - command line option to get input filename from, defaults to 'tarfile'
         * @return bool
         */
        private function untar( $destination_path, $option = 'tarfile' ) {
    
          if ( $tarfile = $this->getOption( $option, false ) ) {
            WP_CLI::launch( "gzip -d $tarfile" );
            $tarfile = substr( $tarfile, 0, strlen( $tarfile ) - 3 );
            WP_CLI::launch( "tar -xf $tarfile -C \"$destination_path\"" );
            return true;
          } else {
            return false;
          }
    
        }
    
        /**
         * Extract a zip archive
         * @param  $destination_path - the path to extract to
         * @param  $option          - command line option to get zip filename from, defaults to 'zipfile'
         * @return bool
         */
        private function unzip( $destination_path, $option = 'zipfile' ) {
    
          if ( $zipfile = $this->getOption( $option, false ) ) {
            WP_CLI::line( 'Extracting zip archive ...' );
            WP_CLI::launch( "unzip -q $zipfile -d $destination_path" );
            return true;
          } else {
            return false;
          }
    
        }
    
      }
    
      WP_CLI::add_command( 'civicrm', 'CiviCRM_Command' );
      WP_CLI::add_command( 'cv', 'CiviCRM_Command' );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      # Set path early.
      WP_CLI::add_hook( 'before_wp_load', function() {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        # If --path is set, save for later use by CiviCRM.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        global $civicrm_paths;
        $wp_cli_config = WP_CLI::get_config();
        if (!empty($wp_cli_config['path'])) {
          $civicrm_paths['cms.root']['path'] = $wp_cli_config['path'];
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        # If --url is set, save for later use by CiviCRM.
        if (!empty($wp_cli_config['url'])) {
          $civicrm_paths['cms.root']['url'] = $wp_cli_config['url'];
        }
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    }