'/srv/www/drupal', * 'uri' => 'staging.site.com', * 'source-command-specific' => array( * 'sql-sync' => array( * 'http-sync' => 'https://staging.site.com/protected-directory/site-database-dump.sql', * 'http-sync-user' => 'wwwadmin', * 'http-sync-password' => 'secretsecret', * ), * ), * ); * * To use this feature, copy the 'source-command-specific' * item from the example alias above, place it in your staging * site aliases, and custom the access credentials as * necessary. You must also copy the sync_via_http.drush.inc * file to a location where Drush will find it, such as * $HOME/.drush. See `drush topic docs-commands` for more * information. * * IMPORTANT NOTE: This example does not cause the sql dump * to be performed; it is presumed that the dump file already * exists at the provided URL. For a full solution, a web page * that initiated an sql-dump (or perhaps a local sql-sync followed * by an sql-sanitize and then an sql-dump) would be necessary. */ /** * Implement hook help alter. * * When a hook extends a command with additional options, it must * implement help alter and declare the option(s). Doing so will add * the option to the help text for the modified command, and will also * allow the new option to be specified on the command line. Without * this, Drush will fail with an error when a user attempts to use * the option. */ function sync_via_http_drush_help_alter(&$command) { if ($command['command'] == 'sql-sync') { $command['options']['http-sync'] = "Copy the database via http instead of rsync. Value is the url that the existing database dump can be found at."; $command['sub-options']['http-sync']['http-sync-user'] = "Username for the protected directory containing the sql dump."; $command['sub-options']['http-sync']['http-sync-password'] = "Password for the same directory."; } } /** * Implement hook pre sql sync. * * During the pre hook, determine if the http-sync option has been * specified. If it has been, then disable the normal ssh + rsync * dump-and-transfer that sql-sync usually does, and transfer the * database dump via an http download. */ function drush_sync_via_http_pre_sql_sync($source = NULL, $destination = NULL) { $sql_dump_download_url = drush_get_option('http-sync'); if (!empty($sql_dump_download_url)) { $user = drush_get_option('http-sync-user', FALSE); $password = drush_get_option('http-sync-password', FALSE); $source_dump_file = _drush_sync_via_http_download_file($sql_dump_download_url, $user, $password); if ($source_dump_file === FALSE) { return drush_set_error('DRUSH_CANNOT_DOWNLOAD', dt("The URL !url could not be downloaded.", array('!url' => $sql_dump_download_url))); } drush_set_option('target-dump', $source_dump_file); drush_set_option('no-dump', TRUE); drush_set_option('no-sync', TRUE); } } /** * Download a file, optionaly with user authentication, using either wget or * curl, as available. */ function _drush_sync_via_http_download_file($url, $user = FALSE, $password = FALSE, $destination = FALSE, $overwrite = TRUE) { static $use_wget; if ($use_wget === NULL) { $use_wget = drush_shell_exec('which wget'); } $destination_tmp = drush_tempnam('download_file'); if ($use_wget) { if ($user && $password) { drush_shell_exec("wget -q --timeout=30 --user=%s --password=%s -O %s %s", $user, $password, $destination_tmp, $url); } else { drush_shell_exec("wget -q --timeout=30 -O %s %s", $destination_tmp, $url); } } else { if ($user && $password) { drush_shell_exec("curl -s -L --connect-timeout 30 --user %s:%s -o %s %s", $user, $password, $destination_tmp, $url); } else { drush_shell_exec("curl -s -L --connect-timeout 30 -o %s %s", $destination_tmp, $url); } } if (!drush_get_context('DRUSH_SIMULATE')) { if (!drush_file_not_empty($destination_tmp) && $file = @file_get_contents($url)) { @file_put_contents($destination_tmp, $file); } if (!drush_file_not_empty($destination_tmp)) { // Download failed. return FALSE; } } if ($destination) { drush_move_dir($destination_tmp, $destination, $overwrite); return $destination; } return $destination_tmp; }