diff --git a/profiles/unl_profile/unl_profile.install b/profiles/unl_profile/unl_profile.install index 50b2b5f89487c6bfc3ef0ea3588b5e04c0beb04a..7e1414d27040ec1cd90b34766f37a7b9a329d0e4 100644 --- a/profiles/unl_profile/unl_profile.install +++ b/profiles/unl_profile/unl_profile.install @@ -227,6 +227,7 @@ EOF; $new_prefix = $GLOBALS['databases']['default']['default']['prefix']; $shared_prefix = $parent_site_database_settings['default']['default']['prefix']; + $short_prefix = substr($new_prefix, 0, 0 - (strlen($shared_prefix) + 1)); $new_prefixes = array( // Localized tables, prefixed with site name 'default' => $new_prefix, @@ -303,6 +304,48 @@ EOF; unset($all_permissions[$permission]); } user_role_grant_permissions($site_admin_role->rid, array_keys($all_permissions)); + + // If a site admin has been specified, add that user and add them to the Site Admin role. + $data = db_query( + "SELECT * " + . "FROM {$shared_prefix}variable " + . "WHERE name IN ('unl_frontier_username', 'unl_frontier_password')" + ); + $frontier_config = array(); + foreach ($data as $row) { + $frontier_config[$row->name] = unserialize($row->value); + } + + $data = db_query( + "SELECT * " + . "FROM {$shared_prefix}unl_sites " + . "WHERE db_prefix = :prefix ", + array(':prefix' => $short_prefix) + ); + foreach ($data as $row) { + if ($row->site_admin) { + $userData = array( + 'name' => $row->site_admin, + 'status' => 1, + 'timezone' => variable_get('date_default_timezone', @date_default_timezone_get()), + 'roles' => array($site_admin_role->rid => $site_admin_role->name), + ); + user_save(NULL, $userData); + } + + if ($row->migration_url) { + require_once DRUPAL_ROOT . '/sites/all/modules/unl/unl_migration.php'; + $migration = new Unl_Migration_Tool( + $row->migration_url, + $row->migration_path, + $frontier_config['unl_frontier_username'], + $frontier_config['unl_frontier_password'], + FALSE + ); + DrupalQueue::get('unl_migration', TRUE) + ->createItem(Unl_Migration_Tool::save_to_disk($migration)); + } + } } diff --git a/sites/all/modules/unl/unl.install b/sites/all/modules/unl/unl.install index ca5a547999ba26bdfe8d56031756f441018d6cf0..b337818dc0cb01f6d2fd788c52ae69c85d1aa6bf 100644 --- a/sites/all/modules/unl/unl.install +++ b/sites/all/modules/unl/unl.install @@ -37,7 +37,26 @@ function unl_schema() { 'length' => 255, 'not null' => TRUE, 'default' => '', - ) + ), + 'site_admin' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'migration_url' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'migration_path' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + ), 'primary key' => array('site_id'), 'unique keys' => array( @@ -188,3 +207,27 @@ function unl_update_7103() { db_create_table('unl_sites_aliases', $table); } + +function unl_update_7104() { + db_add_field('unl_sites', 'site_admin', array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + )); +} + +function unl_update_7105() { + db_add_field('unl_sites', 'migration_url', array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + )); + db_add_field('unl_sites', 'migration_path', array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + )); +} diff --git a/sites/all/modules/unl/unl.module b/sites/all/modules/unl/unl.module index 78c2518e27dd9c785741e83d3df6bdb632ace77c..d3755df5585a69766c28837de1ebfde746645dbb 100644 --- a/sites/all/modules/unl/unl.module +++ b/sites/all/modules/unl/unl.module @@ -143,6 +143,16 @@ function unl_menu() { 'type' => MENU_LOCAL_TASK, 'file' => 'unl_site_creation.php', ); + + $items['admin/sites/unl/wdn_registry'] = array( + 'title' => 'WDN Registry', + 'description' => 'Settings for the connection to the WDN Registry.', + 'access arguments' => array('unl site creation'), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('unl_wdn_registry'), + 'type' => MENU_LOCAL_TASK, + 'file' => 'unl_site_creation.php', + ); } return $items; @@ -359,3 +369,93 @@ function unl_user_access($permissions, $account = NULL) { return TRUE; } + +function unl_cron() +{ + if (PHP_SAPI == 'cli') { + return; + } + + $queue = DrupalQueue::get('unl_migration'); + if ($queue->numberOfItems() > 0) { + require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'unl_migration.php'; + $item = $queue->claimItem(120); + $queue->deleteItem($item); + unl_migration_queue_step($item->data); + } + + if (conf_path() == 'sites/default') { + + $wdn_registry_info = array( + 'database' => variable_get('unl_wdn_registry_database'), + 'username' => variable_get('unl_wdn_registry_username'), + 'password' => variable_get('unl_wdn_registry_password'), + 'host' => variable_get('unl_wdn_registry_host'), + 'driver' => 'mysql', + ); + + if (!$wdn_registry_info['database']) { + return; + } + + Database::addConnectionInfo('wdn_registry', 'default', $wdn_registry_info); + db_set_active('wdn_registry'); + + try { + $data = db_select('site_request', 'r') + ->fields('r') + ->where('`url` IS NULL') + ->execute() + ->fetchAll(); + } + catch (Exception $e) { + db_set_active(); + return; + } + + $sites_to_create = array(); + foreach ($data as $site) { + $path = $site->department . '/' . $site->site_name; + $path = strtolower($path); + $path = strtr($path, array(' ' => '')); + + $db_prefix = $site->site_name; + $db_prefix = strtolower($db_prefix); + $db_prefix = strtr($db_prefix, array(' ' => '')); + + $path = 'incubator/' . $path; + + $sites_to_create[] = array( + 'site_path' => $path, + 'uri' => url($path), + 'clean_url' => TRUE, + 'db_prefix' => $db_prefix, + 'site_admin' => $site->site_admin, + 'migration_url' => $site->migration_url, + 'migration_path' => $site->migration_path, + ); + + if (variable_get('unl_wdn_registry_production')) { + db_update('site_request') + ->fields(array('url' => url($path))) + ->condition('id', $site->id) + ->execute(); + } + } + + db_set_active(); + + foreach ($sites_to_create as $site_to_create) { + try { + db_insert('unl_sites')->fields($site_to_create)->execute(); + } + catch (PDOException $e) { + // Ignore duplicate records. + if ($e->getCode() != 23000) { + throw $e; + } + } + } + + } +} diff --git a/sites/all/modules/unl/unl_migration.php b/sites/all/modules/unl/unl_migration.php index ad7af15f2529c188772f5f342c1c423a2e0e46ae..d2050d39179a24ebafba37a6282027dab989aae6 100644 --- a/sites/all/modules/unl/unl_migration.php +++ b/sites/all/modules/unl/unl_migration.php @@ -59,21 +59,27 @@ function unl_migration($form, &$form_state) function unl_migration_submit($form, &$form_state) { - $operations = array(); + $migration = new Unl_Migration_Tool( + $form_state['values']['site_url'], + $form_state['values']['frontier_path'], + $form_state['values']['frontier_user'], + $form_state['values']['frontier_pass'], + $form_state['values']['ignore_duplicates'] + ); $operations = array( array( 'unl_migration_step', array( - $form_state['values']['site_url'], - $form_state['values']['frontier_path'], - $form_state['values']['frontier_user'], - $form_state['values']['frontier_pass'], - $form_state['values']['ignore_duplicates'], + $migration, ) ) ); + DrupalQueue::get('unl_migration', TRUE) + ->createItem(Unl_Migration_Tool::save_to_disk($migration)); + return; + $batch = array( 'operations' => $operations, 'file' => substr(__FILE__, strlen(DRUPAL_ROOT) + 1), @@ -81,23 +87,13 @@ function unl_migration_submit($form, &$form_state) { batch_set($batch); } -function unl_migration_step($site_url, $frontier_path, $frontier_user, $frontier_pass, $ignore_duplicates, &$context) +function unl_migration_step($migration, &$context) { $finished = 0; if (isset($context['sandbox']['file']) && file_exists($context['sandbox']['file'])) { - $migration = unserialize(file_get_contents($context['sandbox']['file'])); - unlink($form_state['storage']['file']); + $migration = Unl_Migration_Tool::load_from_disk($context['sandbox']['file']); $finished = $context['sandbox']['finished']; } - else { - $migration = new Unl_Migration_Tool( - $site_url, - $frontier_path, - $frontier_user, - $frontier_pass, - $ignore_duplicates - ); - } if ($migration->migrate()) { $context['finished'] = 1; @@ -110,9 +106,16 @@ function unl_migration_step($site_url, $frontier_path, $frontier_user, $frontier } $context['finished'] = $finished; $context['sandbox']['finished'] = $finished; - $migration_storage_file = drupal_tempnam(file_directory_temp(), 'unl_migration_'); - $context['sandbox']['file'] = $migration_storage_file; - file_put_contents($migration_storage_file, serialize($migration)); + $context['sandbox']['file'] = Unl_Migration_Tool::save_to_disk($migration); +} + +function unl_migration_queue_step($migration_storage_file) { + $migration = Unl_Migration_Tool::load_from_disk($migration_storage_file); + if ($migration->migrate(30)) { + return; + } + DrupalQueue::get('unl_migration', TRUE) + ->createItem(Unl_Migration_Tool::save_to_disk($migration)); } @@ -751,7 +754,7 @@ class Unl_Migration_Tool 'und' => array( array( 'value' => $content, - 'format' => filter_default_format() + 'format' => array_shift(array_keys(filter_formats())) ) ) ); @@ -1016,5 +1019,21 @@ class Unl_Migration_Tool return FALSE; } + + static public function save_to_disk(Unl_Migration_Tool $instance) + { + $migration_storage_file = drupal_tempnam(file_directory_temp(), 'unl_migration_'); + file_put_contents($migration_storage_file, serialize($instance)); + if (PHP_SAPI == 'cli') { + chmod($migration_storage_file, 0666); + } + return $migration_storage_file; + } + + static public function load_from_disk($migration_storage_file) { + $instance = unserialize(file_get_contents($migration_storage_file)); + unlink($migration_storage_file); + return $instance; + } } diff --git a/sites/all/modules/unl/unl_site_creation.php b/sites/all/modules/unl/unl_site_creation.php index 96c28fab6910bcd38e941b4787bc17fa5d48e887..3519ab41df4f4fa2e567d8cb94b0610cca776639 100644 --- a/sites/all/modules/unl/unl_site_creation.php +++ b/sites/all/modules/unl/unl_site_creation.php @@ -390,6 +390,85 @@ function unl_alias_list_submit($form, &$form_state) { } +function unl_wdn_registry($form, &$form_state) { + + $form['root'] = array( + '#type' => 'fieldset', + '#title' => 'WDN Registry Database', + ); + + $form['root']['production'] = array( + '#type' => 'checkbox', + '#title' => 'This is production.', + '#description' => 'If this box checked, sites imported will be marked as imported.', + '#default_value' => variable_get('unl_wdn_registry_production'), + ); + + $form['root']['host'] = array( + '#type' => 'textfield', + '#title' => 'Host', + '#description' => 'Hostname of the WDN Registry database.', + '#default_value' => variable_get('unl_wdn_registry_host'), + '#required' => TRUE, + ); + + $form['root']['username'] = array( + '#type' => 'textfield', + '#title' => 'Username', + '#description' => 'Username for the WDN Registry database.', + '#default_value' => variable_get('unl_wdn_registry_username'), + '#required' => TRUE, + ); + + $form['root']['password'] = array( + '#type' => 'password', + '#title' => 'Password', + '#description' => 'Password for the WDN Registry database.', + '#required' => TRUE, + ); + + $form['root']['database'] = array( + '#type' => 'textfield', + '#title' => 'Database', + '#description' => 'Database for the WDN Registry database.', + '#default_value' => variable_get('unl_wdn_registry_database'), + '#required' => TRUE, + ); + + $form['root']['frontier_username'] = array( + '#type' => 'textfield', + '#title' => 'Frontier Username', + '#description' => 'Username to connect to frontier FTP.', + '#default_value' => variable_get('unl_frontier_username'), + '#required' => TRUE, + ); + + $form['root']['frontier_password'] = array( + '#type' => 'password', + '#title' => 'Frontier Password', + '#description' => 'Password to connect to frontier FTP.', + '#required' => TRUE, + ); + + $form['root']['submit'] = array( + '#type' => 'submit', + '#value' => 'Update', + ); + + return $form; +} + +function unl_wdn_registry_submit($form, &$form_state) { + variable_set('unl_wdn_registry_production', $form_state['values']['production']); + variable_set('unl_wdn_registry_host', $form_state['values']['host']); + variable_set('unl_wdn_registry_username', $form_state['values']['username']); + variable_set('unl_wdn_registry_password', $form_state['values']['password']); + variable_set('unl_wdn_registry_database', $form_state['values']['database']); + variable_set('unl_frontier_username', $form_state['values']['frontier_username']); + variable_set('unl_frontier_password', $form_state['values']['frontier_password']); +} + + function _unl_get_install_status_text($id) { switch ($id) { case 0: