Skip to content
Snippets Groups Projects
civicrm.php 40.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • 			$backup_dir .= '/plugins/' . $date;
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    			if ( ! mkdir( $backup_dir, 0755, true ) ) {
    
    				return WP_CLI::error( 'Failed creating directory: ' . $backup_dir );
    			}
    
    			$backup_target = $backup_dir . '/' . $backup_file;
    
    			if ( ! rename( $project_path, $backup_target ) ) {
    				return WP_CLI::error( sprintf(
    					'Failed to backup CiviCRM project directory %s to %s',
    					$project_path,
    					$backup_target
    				) );
    			}
    
    			WP_CLI::line();
    			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();
    
    			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 ( ! count( $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 );
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    				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' );