Newer
Older
# begin upgrade
$backup_dir .= '/plugins/' . $date;
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
['civicrm', 'sql-dump'],
['result-file' => $backup_target . '.sql']
# 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::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');
}
/**
* Implementation of command 'upgrade-db'
*/
private function upgradeDB() {
civicrm_initialize();
if (!defined('CIVICRM_UPGRADE_ACTIVE')) {
define('CIVICRM_UPGRADE_ACTIVE', 1);
# 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());
require_once 'CRM/Core/Smarty.php';
$template = CRM_Core_Smarty::singleton();
$upgrade = new CRM_Upgrade_Page_Upgrade();
// new since CiviCRM 4.1
if (is_callable([$upgrade, 'setPrint'])) {
$upgrade->setPrint(TRUE);
}
# to suppress html output /w source code.
ob_start();
$upgrade->run();
# capture the required message.
}
}
/**
* 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
* @return array containing db connection details
*/
private static function parseDSN($dsn) {
$parsed = [
'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 => phptype(dbsyntax)
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
$parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
}
else {
$parsed['phptype'] = $str;
$parsed['dbsyntax'] = $str;
}
// $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
}
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 {
}
}
// 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);
$parsed['socket'] = $proto_opts;
}
// Get dabase if any
// $dsn => database
if ($dsn) {
if (($pos = strpos($dsn, '?')) === FALSE) {
$parsed['database'] = rawurldecode($dsn);
}
else {
$parsed['database'] = rawurldecode(substr($dsn, 0, $pos));
$dsn = substr($dsn, $pos + 1);
if (strpos($dsn, '&') !== FALSE) {
$opts = explode('&', $dsn);
else {
// database?param1=value1
$opts = [$dsn];
}
foreach ($opts as $opt) {
list($key, $value) = explode('=', $opt);
if (!isset($parsed[$key])) {
}
}
}
}
return $parsed;
}
/**
* Helper function to replicate functionality of drush_get_option
*
* @param string $name
* @param string $default
* @return mixed The value if found or default if not.
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_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'])) {
}
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_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'])) {
}
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');
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'];
}
# 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'];
}