provision_drupal.drush.inc 20.8 KB
Newer Older
1
<?php
2
// $Id$
3
4
5

include_once(dirname(__FILE__) . '/../provision.config.inc');

6
7
8
9
10
11
12
13
/**
 * @file
 * Drupal specific functions for the provisioning framework.
 *
 * This module is responsible for the creation and maintenance of the drupal settings.php file, the sites directory structure
 * and all the install api code. 
 */

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function provision_drupal_drush_help($section) {
  switch ($section) {
    case 'error:PROVISION_CONFIG_NOT_VALID' : 
      return dt('Config file could not be loaded.');
    case 'error:PROVISION_DRUPAL_SITE_INSTALLED' : 
      return dt('Site has already been installed.');
    case 'error:PROVISION_DRUPAL_SITE_NOT_FOUND' : 
      return dt('Site was not found.');
    case 'error:PROVISION_DRUPAL_INSTALL_FAILED' : 
      return dt('Could not complete Drupal installation.');
    case 'error:PROVISION_DRUPAL_UPDATE_FAILED' : 
      return dt('Could not complete Drupal update.');
    case 'error:PROVISION_BACKUP_PATH_NOT_FOUND' :
      return dt("Backup directory does not exist.");
    case 'error:PROVISION_DRUPAL_INSTALL_MISSING_REQUIREMENTS' :
      return dt("Could not meet the requirements for installing the drupal profile");
    case 'error:PROVISION_REQUIRES_URL' : 
      return dt('You need to specify the URL argument for this command');
  }

}

36
37
38
39
40
41
42
43
44
45
46
function provision_drupal_drush_engine_drupal() {
  $engines = array();
  $engines['install'] = array();
  $engines['import'] = array();
  $engines['deploy'] = array();
  $engines['clear'] = array();
  $engines['packages'] = array();
  $engines['verify'] = array();
  return $engines;
}

47
48
49
/**
 * Initialize the platform / site
 *
50
 * This function is executed by drush_invoke, and is responsible
51
52
 * for populating the $data context array
 */
53
function provision_drupal_drush_init() {
54
55
  $command = drush_get_command();
  $command = explode(" ", $command['command']);
56

57
  if (preg_match("/^provision-/", $command[0])) {
58
    _provision_context_init();
59
60
61
  }
}

62
function _provision_context_init() {
63
  static $is_run = false;
64

65
66
67
68
  if ($is_run) {
    return TRUE;
  }

69
  $context = drush_get_option('provision-context');
70
  if (($context === 'platform' || $context === 'site') && drush_bootstrap_validate(DRUSH_BOOTSTRAP_DRUPAL_ROOT)) { 
71
72
    // i don't think i should be bootstrapping here yet ... but i have no choice yet.
    drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_ROOT);
73
74
    if ($context === 'site') {
      drush_set_default('site_url', drush_get_option('uri'));
75
76
77
      drush_set_default('profile', 'default');
      drush_set_default('language', 'en');
      drush_set_default('aliases', array());
78
    }
79
  }
80

drumm's avatar
drumm committed
81
82
83
  define('PROVISION_CONTEXT_SERVER', $context === 'server');
  define('PROVISION_CONTEXT_PLATFORM', $context === 'platform');
  define('PROVISION_CONTEXT_SITE', $context === 'site');
84

drumm's avatar
drumm committed
85
86
  drush_log(dt('Using context @context', array('@context' => $context)));

drumm's avatar
drumm committed
87
  // Initialize services.
drumm's avatar
drumm committed
88
89
90
91
92
  foreach (drush_get_merged_options() as $option => $value) {
    if (preg_match('/^provision-service-([a-z]*)/', $option, $match)) {
      include_once dirname(__FILE__) . '/../' . $match[1] . '/' . $value . '/'. $value .'_service.inc';
      $class = 'provisionService_' . $match[1] . '_' . $value;
      provision_service($match[1], new $class());
drumm's avatar
drumm committed
93
94
95
    }
  }

drumm's avatar
drumm committed
96
  $is_run = TRUE;
97
98
99
100
101
102
103
104
105
}

/**
 * Finalize the platform / site
 *
 * This will run only if there were no errors in any of the previous hooks,
 * and will allow us to cache the successful settings to the site.php/ drushrc.php
 * files for future runs.
 */
106
function provision_drupal_drush_exit() {
107
108
  $command = drush_get_command();
  $command = explode(" ", $command['command']);
109
110

  if (preg_match("/^provision-/", $command[0])) {
111
112
113
114
    if (PROVISION_CONTEXT_SITE) {
      if (drush_get_option('installed')) {
        drush_set_option('site_url', drush_get_option('site_url'), 'site');
        drush_set_option('site_id', drush_get_option('site_id'), 'site');
115
        drush_set_option('client_email', drush_get_option('client_email'), 'site');
116
        provision_save_site_data();
117
118
      }
    }
119
    elseif (PROVISION_CONTEXT_PLATFORM) {
120
121
      // Generate a drushrc.php for the platform unless it's being deleted
      if (!preg_match("/^provision-delete/", $command[0])) {
122
        provision_save_platform_data();
123
      }
Adrian Rossouw's avatar
Adrian Rossouw committed
124
    }
125
126
127
    elseif (PROVISION_CONTEXT_SERVER) {
      provision_save_server_data();
    }
128
129
130
131
132
133
134
135
136
  }
}

/**
 * Some commands need to have a url to operate on.
 *  This prints out a message to that effect.
 */
function _provision_drupal_url_required() {
  if (PROVISION_CONTEXT_PLATFORM) {
137
    drush_set_error('PROVISION_REQUIRES_URL');
138
139
140
141
142
143
144
145
146
147
  }
}

/**
 * Validate a site exists, ie: has a settings.php file
 *
 * This will return an error for sites that haven't been created yet
 */
function _provision_drupal_valid_site() {
  if (PROVISION_CONTEXT_SITE) {
148
    if (!_provision_drupal_site_exists()) {
149
      drush_set_error('PROVISION_DRUPAL_SITE_NOT_FOUND');
150
151
    }
  }
152
153
}

154
155
156
157
158
159
160
161
/**
 * Test to see if the site settings.php exists
 *
 * @param url
 *   The url of the site to check
 * @return
 *   If the file exists, return TRUE, else return FALSE.
 */
162
163
function _provision_drupal_site_exists() {
  return file_exists('sites/' . drush_get_option('uri') . '/settings.php');
164
165
}

166
167
168
169
170
171
172
173

/**
 * Validate a site has been installed, by checking it's site.php file. 
 *
 * This will return an error for sites that haven't been installed yet
 */
function _provision_drupal_valid_installed_site() {
  if (PROVISION_CONTEXT_SITE) {
174
    if (!_provision_drupal_site_installed()) {
175
      drush_set_error('PROVISION_DRUPAL_SITE_NOT_FOUND');
176
177
178
179
180
181
    }
  }
}

function _provision_drupal_valid_not_installed_site() {
  if (PROVISION_CONTEXT_SITE) {
182
    if (_provision_drupal_site_installed()) {
183
      drush_set_error('PROVISION_DRUPAL_SITE_INSTALLED');
Adrian Rossouw's avatar
Adrian Rossouw committed
184
185
186
    }
  }
}
187
188

/**
189
 * Test to see if the site has a site.php and has it set to 'installed'
190
 */
191
192
function _provision_drupal_site_installed() {
  if (_provision_drupal_site_exists()) {
193
    return drush_get_option('installed');
194
  }
195
  return FALSE;
196
197
}

198
199
200
201
202
203
204
205
206
/**
 * Generate a settings file for the site.
 *
 * @param url
 *   The url of the site being invoked.
 * @param data
 *   A reference to the associated array containing the data for the site. This needs to be a reference, 
 *   because the modules might provide additional information about the site.
 */
207
function _provision_drupal_create_settings_file() {
208
209
  $config = new provisionConfig_drupal_settings(drush_get_merged_options());
  $config->write();
210
211
}

212
213
214
class provisionConfig_drupal_settings extends provisionConfig {
  public $template = 'provision_drupal_settings.tpl.php';
  public $description = 'Drupal settings.php file';
215
  protected $mode = 0440;
216
217
218
219
220
221
222
223
224
225
226
227

  function filename() {
    return $this->data['sites_path'] . '/' . $this->data['site_url'] . '/settings.php';
  }

  function process() {
    if (drush_drupal_major_version() >= 7) {
      $this->data['db_type'] = ($this->data['db_type'] == 'mysqli') ? 'mysql' : $this->data['db_type'];
    }

    $this->data['extra_config'] = "# Extra configuration from modules:\n";
    $this->data['extra_config'] .= join("\n", drush_command_invoke_all('provision_drupal_config', $this->data['site_url'], $this->data));
228
229

    $this->group = drush_get_option('web_group');
230
231
232
  }
}

233
234
235
236
237
/**
 * Create the directories needed to host a drupal site
 * 
 * Also maintains permissions on existing directories.
 */
238
239
240
241
function _provision_drupal_create_directories($url = NULL, $profile = NULL) {  
  if (is_null($url)) {
    $url = drush_get_option('uri');
  }
242
243
  # those directories will be created and their modes changed
  $mkdir = array(
244
    "sites/$url"                 => 0755,
245
    # those should be writable by the aegir primary group to ease development
246
247
248
    "sites/$url/themes"          => 02775,
    "sites/$url/modules"         => 02775,  
    "sites/$url/libraries"       => 02775, # http://drupal.org/node/496240
249
250
251
252
    // d7 support
    "sites/$url/private"         => 0755,
    "sites/$url/private/files"   => 02770,
    "sites/$url/private/temp"    => 02770,
253
  );
254
255
  $chown = array();
  $chgrp = array();
256
  // special case: platform. do not handle files dir
257
  if ($url != 'all') {
258
    $mkdir["sites/$url/files"]          = 02770;
259
260
261
262
    $mkdir["sites/$url/files/tmp"]          = 02770;
    $mkdir["sites/$url/files/images"]          = 02770;
    $mkdir["sites/$url/files/pictures"]          = 02770;
    # the owner/group of those directories will be changed recursively
263
264
    $chown["sites/$url/files"]          = drush_get_option('script_user');
    $chgrp["sites/$url/files"]          = drush_get_option('web_group');
265
    $chown["sites/$url/private"]        = drush_get_option('script_user');
266
    $chgrp["sites/$url/private/files"]  = drush_get_option('web_group');
267
    $chgrp["sites/$url/private/temp"]   = drush_get_option('web_group');
268
  }
269

270
  foreach ($mkdir as $path => $perm) {
271
    if (!is_dir($path)) {
272
273
274
      provision_service('file')->mkdir($path) 
        ->succeed('Created <code>@path</code>')
        ->fail('Could not create <code>@path</code>', 'DRUSH_PERM_ERROR');
275
    }
276

277
278
279
    provision_service('file')->chmod($path, $perm, TRUE)
      ->succeed('Changed permissions of <code>@path</code> to @perm')
      ->fail('Could not change permissions <code>@path</code> to @perm');
280
  }
281
  foreach ($chown as $path => $owner) {
282
    provision_service('file')->chown($path, $owner, TRUE)
anarcat's avatar
anarcat committed
283
      ->succeed('Changed ownership of <code>@path</code> to @uid')
284
      ->fail('Could not change ownership <code>@path</code>', 'DRUSH_PERM_ERROR');
285
286
  }
  foreach ($chgrp as $path => $group) {
287
    provision_service('file')->chgrp($path, $group, TRUE)
anarcat's avatar
anarcat committed
288
      ->succeed('Changed group ownership of <code>@path</code> to @gid')
289
      ->fail('Could not change group ownership <code>@path</code>');
290
291
292
  }
}

293
294
295
/**
 * Runs an external script to reload all the various drupal caches
 */
296
function _provision_drupal_rebuild_caches() {
297
  if (PROVISION_CONTEXT_SITE) {
298
    drush_include_engine('drupal', 'clear');
299
  }
Adrian Rossouw's avatar
Adrian Rossouw committed
300
301
}

302

303
304
305
306
307
308
/**
 * Find available profiles on this platform.
 */
function _provision_find_profiles() {
  include_once('includes/install.inc');

309
  if (!$dir = opendir("./profiles")) {
310
    drush_log(dt("Cannot find profiles directory"), 'error');
311
312
313
    return FALSE;
  }
  while (FALSE !== ($name = readdir($dir))) {
314
    $languages = array();
315
316
317
318
319
320
321
322
    $file = "./profiles/$name/$name.profile";
    if ($name == '..' || $name == '.' || !file_exists($file)) {
      continue;
    }
    $profile = new stdClass();
    $profile->name = $name;
    $profile->filename = $file;

323
    _provision_cvs_deploy($profile);
324
325
326
327
328
    require_once($profile->filename);
    $func = $profile->name . "_profile_details";
    if (function_exists($func)) {
      $profile->info =  $func();
    }
329

330
    $languages['en'] = 1;
331
    // Find languages available
332
333
    $files = array_keys(drush_scan_directory('./profiles/' . $name . '/translations', '/\.po$/', array('.', '..', 'CVS'), 0, FALSE, 'filepath'));
    $files = array_merge($files, array_keys(drush_scan_directory('./profiles/' . $name , '/\.po$/', array('.', '..', 'CVS'), 0, FALSE, 'filepath')));
334
335
336
337
338
    if (is_array($files)) {
      foreach ($files as $file) {
        if (preg_match('!(/|\.)([^\./]+)\.po$!', $file, $langcode)) {
          $languages[$langcode[2]] = 1; // use the language name as an index to weed out duplicates
        }
339
340
      }
    }
Adrian Rossouw's avatar
Adrian Rossouw committed
341
    $profile->info['languages'] = array_keys($languages);
342
343
344
345
346
347
348

    // Drupal 7 renamed the default install profile to 'standard'
    // Aegir now allows projects to specify an "old short name" to provide an upgrade path when projects get renamed. 
    if ($profile->name == 'standard') {
      $profile->info['old_short_name'] = 'default';
    }

anarcat's avatar
anarcat committed
349
    $return[$name] = $profile;
350
    drush_log(dt('Found install profile %name', array('%name' => $name)));
351
  }
352

353
354
355
356
  return $return;

}

357
function provision_drupal_find_sites() {
358
359
  if ($dir = opendir("./sites")) {
    while (FALSE !== ($subdir = readdir($dir))) {
360
      // skip internal directory pointers
361
      if ($subdir != '.' && $subdir != '..') {
362
363
364
365
        $file = "./sites/$subdir/settings.php";
        if (file_exists("$file") && ($subdir != 'default') && !is_link("./sites/$subdir")) {
          $sites[$subdir] = $file;
        }
366
367
      }
    }
368
    closedir($dir);
369
  } else {
370
    drush_log(dt("Cannot find sites directory"), 'error');
371
    $sites = FALSE;
372
373
  }
  return $sites;
374
375
}

Adrian Rossouw's avatar
Adrian Rossouw committed
376
377
function _provision_drupal_get_cvs_versions($files) {
  foreach ($files as $modulename => $file) {
378
379
380
      $project = array();
      $project['filename'] = $file->filename;
      $project['name'] = $file->name;
381
      $file->info['description'] = str_replace("\n", "", $file->info['description']);
382
      if (!isset($project['project'])) {
383
384
385
        $project['project'] = cvs_deploy_get_project_name($project);
      }
      _cvs_deploy_version_alter($file->info['version'], $project);
386
      $name = !empty($project['project']) ? $project['project'] : $modulename;
Adrian Rossouw's avatar
Adrian Rossouw committed
387
      $files[$name] = $file; 
388
  }
389

Adrian Rossouw's avatar
Adrian Rossouw committed
390
  return $files;
391
}
392

393
394
395
/**
 * Create and remove symlinks for each of the possible domain aliases of an existing site
 */
396
function _provision_drupal_maintain_aliases() {
397
  if (PROVISION_CONTEXT_SITE) {
398
    // First we delete all the old aliases
mig5's avatar
mig5 committed
399
    drush_set_option('aliases', drush_get_option('aliases'), 'site');
400
    _provision_drupal_delete_aliases(drush_get_option('aliases', array(), 'site'), false);
401

402
403
404
405
406
407
408
    if (!drush_get_option('redirection')) {
      $aliases = drush_get_option('aliases');
      if (!is_array($aliases)) {
        $aliases = explode(",", $aliases);
      }
      foreach($aliases as $alias) {
        if (trim($alias)) {
409
          provision_service('file')->symlink(drush_get_option('uri'), drush_get_option('publish_path') . '/sites/' . $alias)
410
411
            ->succeed('Created symlink for alias @target')
            ->fail('Could not create symlink for alias @target');
412
        }
413
414
415
416
417
418
419
420
      }
    }
  }
}

/**
 * Delete a list of aliases
 */
421
function _provision_drupal_delete_aliases($aliases, $silent = false) {
422
423
424
  if (!is_array($aliases)) {
    $aliases = explode(",", $aliases);
  }
425
426
  if ($silent) {
    $error = NULL;
427
428
429
  }
  else {
    $error = 'Could not remove symlink for alias @path';
430
  }
431
  foreach ($aliases as $alias) {
432
    if ($alias = trim($alias)) {
433
      provision_service('file')->unlink(drush_get_option('publish_path') . '/sites/' . $alias)
434
435
        ->succeed('Removed symlink for alias @path')
        ->fail($error);
436
    }
437
438
  }
}
439

440
441
442
require_once('cvs_deploy.inc');

function provision_find_packages() {
443
  // Load the version specific include files.
444
  drush_include_engine('drupal', 'packages', drush_drupal_major_version());
445
446
447
448
449
450
451
452
453
454
455

  $packages['base'] = _provision_find_packages('base');

  // Create a package for the Drupal release
  $packages['base']['platforms'] = _provision_find_platforms();

  // Find install profiles.
  $profiles = _provision_find_profiles();
  drush_set_option('profiles', array_keys((array) $profiles), 'drupal'); 

  // Iterate through the install profiles, finding the profile specific packages
456
  foreach ($profiles as $profile => $info) {
457
458
459
460
461
    _provision_cvs_deploy($info);
    if (!$info->version) {
      $info->version = drush_drupal_version();
    }
    $packages['base']['profiles'][$profile] = $info;
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
    $packages['profiles'][$profile] =  _provision_find_packages('profiles', $profile);
  }

  return $packages;
}

function _provision_find_platforms() {
  return array(
    'drupal' => array(
    'short_name' => 'drupal', 'version' => drush_drupal_version(), 
    'description' => dt("This platform is running @short_name @version", array('@short_name' => 'Drupal', '@version' => VERSION))));
}

/**
 * A small helper function to reduce code duplication
 */
function _provision_find_packages($scope, $key = '') {
479
  $packages = array();
480
481
  $scope_text = ($key) ? "$scope/$key" : $scope;
  foreach (array('modules', 'themes') as $type) {
482
    $packages[$type] = array();
483
484
485
486
487
488
489
490
    $func = "_provision_drupal_find_$type";
    $result = $func($scope, $key);
    if (sizeof($result)) {
      $packages[$type] = $result;
      drush_log(dt("Found !count !type in !scope", 
        array('!count' => sizeof($result), 
        '!scope' => $scope_text, '!type' => $type)));
    }
491
492
493
494
  }
  return $packages;
}

495
496
497
498
/**
 * Map the system table to a packages multi-dimensional array component
 */
function provision_drupal_system_map() {
499
  // Load the version specific include files.
500
  drush_include_engine('drupal', 'packages');
501

502
  $profiles = _provision_find_profiles();
503
504
505
506
507
508
509
  foreach ($profiles as $profile => $info) {
    _provision_cvs_deploy($info);
    if (!$info->version) {
      $info->version = drush_drupal_version();
    }
    $profiles[$profile] = $info;
  }
510
  $packages['platforms'] = _provision_find_platforms();
511
512

  $profile = drush_get_option('profile');
513
514
  $packages['profiles'][$profile] = $profiles[$profile];
  $packages['profiles'][$profile]->status = 1;
515
516

  foreach (_provision_system_query("module") as $module) { 
517
518
519
520
521
    $frags = explode("/", $module->filename);
    // ignore site-specific modules
    if ($frags[0] == 'sites' && $frags[1] != 'all') {
      continue;
    }
522
523
524
    $info_file = sprintf("%s/%s.info", dirname($module->filename), $module->name);
    $module->info = provision_parse_info_file($info_file);

525
526
    _provision_cvs_deploy($module);
    $module->filename = realpath($module->filename);
527
528
529
    if ($module->schema_version == -1) {
      $module->schema_version = 0;
    }
530
531
532
533
534
    $packages['modules'][$module->name] = $module;
  }

  drush_log(dt("Found !count modules", array('!count' => sizeof($packages['modules']))));

535
  // XXX: mostly a copy-paste from above
536
  foreach (_provision_system_query("theme") as $theme) { 
537
538
539
540
541
    $frags = explode("/", $theme->filename);
    // ignore site-specific themes
    if ($frags[0] == 'sites' && $frags[1] != 'all') {
      continue;
    }
542
543
    $info_file = sprintf("%s/%s.info", dirname($theme->filename), $theme->name);
    $theme->info = provision_parse_info_file($info_file);
544
545
    _provision_cvs_deploy($theme);
    $theme->filename = realpath($theme->filename);
546
547
548
549
550

    if ($theme->schema_version == -1) {
      $theme->schema_version = 0;
    }

551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
    $packages['themes'][$theme->name] = $theme;
  }
  drush_log(dt("Found !count themes", array('!count' => sizeof($packages['themes']))));
  return $packages;
}

/**
 * Retrieve a list of paths to search in a certain scope
 */
function _provision_drupal_search_paths($scope, $key = '', $type = 'modules') {
  $searchpaths = array();
  $drupal_root = drush_get_context('DRUSH_DRUPAL_ROOT');
  switch ($scope) {
    case 'base' : 
      $searchpaths[] = sprintf("%s/%s", $drupal_root, $type);
      $searchpaths[] = sprintf("%s/sites/all/%s", $drupal_root, $type);
      break;
    default : 
      if ($key) { 
        $searchpaths[] = sprintf("%s/%s/%s/%s", $drupal_root, $scope, $key, $type);
      }
      break;
     
  }
  return $searchpaths;
}
577

578
579
580
581
582
583
584
585
/**
 * Find modules in a certain scope.
 *
 * This function is general enough that it works for all supported
 * versions of Drupal.
 */
function _provision_drupal_find_modules($scope, $key = '') {
  $paths = _provision_drupal_search_paths($scope, $key, 'modules');
586
587
  $files = array();
  foreach ($paths as $path) {
588
    $files = array_merge($files, drush_scan_directory($path, "/\.module$/", array('.', '..', 'CVS', '.svn'), 0, true, 'name'));
589
590
591
  }
  foreach ($files as $name => $info) {
    $install_file = sprintf("%s/%s.install", dirname($info->filename), $name);
592
    $schema_version = 0;
593
594
595
596
597
    if (file_exists($install_file)) {
      $source = file_get_contents(trim($install_file));
      $source = str_replace("\r\n", "\n", $source);
      $source = str_replace("\r", "\n", $source);
      $function_matches = array();
598
        preg_match_all('!function\s*&?([a-zA-Z0-9_]+)_update_([0-9]+)\s*\(.*?\s*\{!', $source, $function_matches);
599
600
      
      if (sizeof($function_matches[0])) {
601
        $schema_version = max($function_matches[2]);
602
603
604
605
606
607
608
609
610
611
612
613
614
      }
    }
    $info_file = sprintf("%s/%s.info", dirname($info->filename), $name);
    $files[$name]->info = provision_parse_info_file($info_file);
    $files[$name]->schema_version = $schema_version;
    _provision_cvs_deploy($files[$name]);
  }
  return $files;
}

function provision_parse_info_file($filename) {
  $info = array();

615
  $defaults = array(
616
617
618
619
620
621
622
    'dependencies' => array(),
    'description' => '',
    'version' => NULL,
    'php' => DRUPAL_MINIMUM_PHP,
  );
  
  if (file_exists($filename)) {
623
    $info = _provision_drupal_parse_info_file($filename);
624
625
626
627
628
629
  }

  // Merge in defaults and return
  return $info + $defaults;
}

630
/**
631
632
633
634
 * Set up the $_SERVER environment variable so that drupal can correctly parse the settings.php file.
 * The real credentials are stored in the Apache vhost of the relevant site, to prevent leaking of 
 * sensitive data to site administrators with PHP access who might otherwise access such credentials 
 * potentially of other sites' settings.php in a multisite set-up.
635
636
637
638
639
640
 */
function provision_prepare_environment() {
  $fields = array('db_type', 'db_host', 'db_user', 'db_passwd', 'db_name');
  foreach ($fields as $key) {
    $_SERVER[$key] = drush_get_option($key, null, 'site');
  }
Adrian Rossouw's avatar
Adrian Rossouw committed
641
642
643
644
645

  // As of Drupal 7 there is no more mysqli type
  if (drush_drupal_major_version() >= 7) {
    $_SERVER['db_type'] = ($_SERVER['db_type'] == 'mysqli') ? 'mysql' : $_SERVER['db_type'];
  }
646
}