backup_migrate_prune.module in Backup and migrate prune 7.2
Same filename and directory in other branches
Create (manually or scheduled) and restore backups of your Drupal MySQL database with an option to exclude table data (e.g. cache_*)
File
backup_migrate_prune.moduleView source
<?php
/**
* @file
* Create (manually or scheduled) and restore backups of your Drupal MySQL
* database with an option to exclude table data (e.g. cache_*)
*/
/* Drupal Hooks */
/**
* Implementation of hook_help().
*/
/**
* Implementation of hook_menu().
*/
function backup_migrate_prune_menu() {
$base_index = count(explode('/', BACKUP_MIGRATE_MENU_PATH));
$items[BACKUP_MIGRATE_MENU_PATH . '/prune'] = array(
'title' => 'Prune',
'description' => 'Administer your gardeners (workers that prune your backups).',
'page callback' => 'backup_migrate_menu_callback',
'page arguments' => array(
'',
'backup_migrate_ui_manual_prune_list',
TRUE,
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_LOCAL_TASK,
'weight' => 5,
);
$items[BACKUP_MIGRATE_MENU_PATH . '/prune/list'] = array(
'title' => 'Prune',
'description' => 'Administer your gardeners (workers that prune your backups).',
'page callback' => 'backup_migrate_menu_callback',
'page arguments' => array(
'',
'backup_migrate_ui_manual_prune_list',
TRUE,
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 5,
);
$items[BACKUP_MIGRATE_MENU_PATH . '/prune/add'] = array(
'title' => 'Add a gardener',
'description' => 'Administer your gardeners (workers that prune your backups).',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'backup_migrate_prune_add_form',
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_LOCAL_ACTION,
'weight' => 2,
);
$items[BACKUP_MIGRATE_MENU_PATH . '/prune/edit/%'] = array(
'title' => 'Add a gardener',
'description' => 'Administer your gardeners (workers that prune your backups).',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'backup_migrate_prune_add_form',
$base_index + 2,
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_CALLBACK,
);
$items[BACKUP_MIGRATE_MENU_PATH . '/prune/delete/%'] = array(
'title' => 'Delete',
'description' => 'Delete the gardener.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'backup_migrate_prune_delete_gardener',
$base_index + 2,
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_CALLBACK,
);
$items[BACKUP_MIGRATE_MENU_PATH . '/prune/prune/%'] = array(
'title' => 'Prune the destination',
'description' => 'Prune the destination.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'backup_migrate_prune_prune_form',
$base_index + 2,
),
'access arguments' => array(
'access backup and migrate',
),
'type' => MENU_CALLBACK,
);
return $items;
}
function backup_migrate_prune_add_form($form, $form_state, $gardener_id = NULL) {
backup_migrate_include('destinations');
try {
$gardener = new Gardener($gardener_id);
} catch (ErrorException $e) {
drupal_set_message($e
->getMessage(), 'error');
}
$form = array();
if ($gardener_id) {
drupal_set_title(t('Edit gardener: @name.', array(
'@name' => $gardener
->getName(),
)));
$message = t('If you change the deletion settings of a gardener will probably end up deleting backups you kept previously. If you are not sure about the resulting configuration <strong>do not change</strong> the deletion settings.<br />Example: If you kept the backups in June for the last 3 years and you change that setting to March all the June backups will be gone.');
$form['warning'] = array(
'title' => array(
'#markup' => '<h3>' . t('Important notice') . '</h3>',
),
'message' => array(
'#markup' => $message,
),
);
}
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#description' => t('Enter a name describing your gardener.'),
'#required' => TRUE,
'#default_value' => $gardener
->getName(),
);
foreach (backup_migrate_get_destinations('list files') as $key => $value) {
$options[$key] = $value->name;
}
$form['destination'] = array(
'#type' => 'select',
'#title' => t('Destination'),
'#description' => t('Select the destination to act upon.'),
'#options' => $options,
'#required' => TRUE,
'#default_value' => $gardener_id ? $gardener
->getDestination()
->get_id() : '',
);
$form['settings'] = array(
'#type' => 'fieldset',
'#title' => t('Deletion settings'),
'#tree' => TRUE,
);
$form['settings']['thisweek_slot'] = array(
'#type' => 'fieldset',
'#title' => t('Backups created this week'),
'#description' => t('Prune backups created this week leaving one backup per day.'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => TRUE,
);
$form['settings']['thisweek_slot']['active'] = array(
'#type' => 'checkbox',
'#title' => t('Active'),
'#default_value' => TRUE,
'#disabled' => TRUE,
);
$form['settings']['thismonth_slot'] = array(
'#type' => 'fieldset',
'#title' => t('Backups created this month'),
'#description' => t('Prune backups created this month leaving only one backup per week.'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
$form['settings']['thismonth_slot']['active'] = array(
'#type' => 'checkbox',
'#title' => t('Active'),
);
$form['settings']['thismonth_slot']['keep'] = array(
'#type' => 'select',
'#options' => array(
1 => t('Monday'),
2 => t('Tuesday'),
3 => t('Wednesday'),
4 => t('Thursday'),
5 => t('Friday'),
6 => t('Saturday'),
7 => t('Sunday'),
),
'#title' => t('Preferred day to keep'),
'#description' => t('Select the day in the week you want to keep. The most recent backup will be kept. If there is no backup on your preferred day a random day will be used.'),
);
$form['settings']['thisyear_slot'] = array(
'#type' => 'fieldset',
'#title' => t('Backups created this year'),
'#description' => t('Prune backups created this year leaving only one backup per month.'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
$form['settings']['thisyear_slot']['active'] = array(
'#type' => 'checkbox',
'#title' => t('Active'),
);
$form['settings']['thisyear_slot']['keep'] = array(
'#type' => 'select',
'#options' => array(
1 => t('1st week'),
2 => t('2nd week'),
3 => t('3rd week'),
4 => t('4th week'),
),
'#title' => t('Preferred week to keep'),
'#description' => t('Select the week of the month to keep. Only the first four weeks will be considered. If there is no backup on your preferred week a random week will be used.'),
);
$form['settings']['pastyears_slot'] = array(
'#type' => 'fieldset',
'#title' => t('Backups created past years'),
'#description' => t('Prune backups created more than one year ago leaving only one backup per year.'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
$form['settings']['pastyears_slot']['active'] = array(
'#type' => 'checkbox',
'#title' => t('Active'),
);
$form['settings']['pastyears_slot']['keep'] = array(
'#type' => 'select',
'#options' => array(
1 => t('January'),
2 => t('February'),
3 => t('March'),
4 => t('April'),
5 => t('May'),
6 => t('June'),
7 => t('July'),
8 => t('August'),
9 => t('September'),
10 => t('October'),
11 => t('November'),
12 => t('December'),
),
'#title' => t('Preferred month to keep'),
'#description' => t('Select the month in the year you want to keep. If there is no backup on your preferred month a random month will be used.'),
);
$settings = $gardener
->getSettings();
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
if ($settings) {
// Fill in the default values
$form['settings']['thismonth_slot']['active']['#default_value'] = $settings['thismonth_slot']['active'];
$form['settings']['thismonth_slot']['keep']['#default_value'] = $settings['thismonth_slot']['keep'];
$form['settings']['thisyear_slot']['active']['#default_value'] = $settings['thisyear_slot']['active'];
$form['settings']['thisyear_slot']['keep']['#default_value'] = $settings['thisyear_slot']['keep'];
$form['settings']['pastyears_slot']['active']['#default_value'] = $settings['pastyears_slot']['active'];
$form['settings']['pastyears_slot']['keep']['#default_value'] = $settings['pastyears_slot']['keep'];
}
$form['gardener_id'] = array(
'#type' => 'hidden',
'#value' => $gardener_id,
);
$form['#submit'][] = 'backup_migrate_prune_menu_submit';
return $form;
}
function backup_migrate_prune_menu_submit($form, &$form_state) {
backup_migrate_include('destinations');
$form_state['redirect'] = array(
BACKUP_MIGRATE_MENU_PATH . '/prune',
);
try {
// Create an empty gardener or a populated gardener
$gardener = new Gardener($form_state['values']['gardener_id']);
// Set the configuration for the gardener
$gardener
->setName($form_state['values']['name']);
$gardener
->setSettings($form_state['values']['settings']);
$gardener
->setCreated(time());
$gardener
->setDestination(backup_migrate_get_destination($form_state['values']['destination']));
// Save the gardener
$gardener
->save();
} catch (ErrorException $e) {
drupal_set_message($e
->getMessage(), 'error');
}
}
/**
* Page callback for the prune list
*
* @todo Move presentation code to a theme function
*/
function backup_migrate_ui_manual_prune_list() {
backup_migrate_include('destinations');
$query = db_select('backup_migrate_gardener', 'bmg')
->fields('bmg')
->execute();
$rows = array();
$days = array(
1 => t('Monday'),
2 => t('Tuesday'),
3 => t('Wednesday'),
4 => t('Thursday'),
5 => t('Friday'),
6 => t('Saturday'),
7 => t('Sunday'),
);
$week = array(
1 => t('1st week'),
2 => t('2nd week'),
3 => t('3rd week'),
4 => t('4th week'),
);
$month = array(
1 => t('January'),
2 => t('February'),
3 => t('March'),
4 => t('April'),
5 => t('May'),
6 => t('June'),
7 => t('July'),
8 => t('August'),
9 => t('September'),
10 => t('October'),
11 => t('November'),
12 => t('December'),
);
while ($result = $query
->fetchAssoc()) {
$result['settings'] = unserialize($result['settings']);
$rows[] = array(
'data' => array(
$result['name'],
backup_migrate_get_destination($result['destination_id'])->name,
$result['settings']['thismonth_slot']['active'] ? $days[$result['settings']['thismonth_slot']['keep']] : t('- Inactive -'),
$result['settings']['thisyear_slot']['active'] ? $week[$result['settings']['thisyear_slot']['keep']] : t('- Inactive -'),
$result['settings']['pastyears_slot']['active'] ? $month[$result['settings']['pastyears_slot']['keep']] : t('- Inactive -'),
format_date($result['created'], 'short'),
theme('item_list', array(
'items' => array(
l(t('Edit'), BACKUP_MIGRATE_MENU_PATH . '/prune/edit/' . $result['gardener_id']),
l(t('Delete'), BACKUP_MIGRATE_MENU_PATH . '/prune/delete/' . $result['gardener_id']),
l(t('Prune'), BACKUP_MIGRATE_MENU_PATH . '/prune/prune/' . $result['gardener_id']),
l(t('See files'), BACKUP_MIGRATE_MENU_PATH . '/destination/list/files/' . $result['destination_id']),
),
)),
),
);
}
$header = array(
t('Gardener name'),
t('Destination'),
t('Keep day'),
t('Keep week'),
t('Keep month'),
t('Created'),
t('Actions'),
);
return theme('table', array(
'header' => $header,
'rows' => $rows,
));
}
function backup_migrate_prune_delete_gardener($form, &$form_state, $gardener_id) {
$form['gardener_id'] = array(
'#type' => 'hidden',
'#value' => $gardener_id,
);
$form = confirm_form($form, t('Are you sure you want to delete this gardener?'), BACKUP_MIGRATE_MENU_PATH . '/prune/list');
return $form;
}
function backup_migrate_prune_delete_gardener_submit($form, &$form_state) {
$form_state['redirect'] = array(
BACKUP_MIGRATE_MENU_PATH . '/prune/list',
);
try {
$gardener = new Gardener($form_state['values']['gardener_id']);
$gardener
->delete();
} catch (ErrorException $e) {
drupal_set_message($e
->getMessage(), 'error');
}
}
/**
* Form for Form API
*/
function backup_migrate_prune_prune_form($form, &$form_state, $gardener_id) {
try {
$gardener = new Gardener($gardener_id);
} catch (ErrorException $e) {
drupal_set_message($e
->getMessage(), 'error');
}
$question = t('Are you sure you want to prune the destination with the rules provided by gardener %gardener?', array(
'%gardener' => $gardener
->getName(),
));
$path = BACKUP_MIGRATE_MENU_PATH . '/prune';
$description = t('If you continue several backup files may be deleted. Proceed only if you are sure you want to delete old backups.');
$yes = t('Delete old backups');
$form = array(
'gardener_id' => array(
'#type' => 'hidden',
'#value' => $gardener_id,
),
);
return confirm_form($form, $question, $path, $description, $yes);
}
/**
* Submit function for backup_migrate_prune_prune_form
*/
function backup_migrate_prune_prune_form_submit($form, &$form_state) {
backup_migrate_prune_prune($form_state['values']['gardener_id']);
$form_state['redirect'] = BACKUP_MIGRATE_MENU_PATH . '/prune';
}
/**
* Helper function to prune a destination
* @param $gardener_id
* The id of the gardener
*/
function backup_migrate_prune_prune($gardener_id) {
try {
$gardener = new Gardener($gardener_id);
if ($deleted = $gardener
->prune()) {
watchdog('backup_migrate_prune', t('Deleted %num backups.', array(
'%num' => $deleted,
)), array(), WATCHDOG_NOTICE);
}
} catch (ErrorException $e) {
drupal_set_message($e
->getMessage(), 'error');
}
}
/**
* Implementation hook_cron().
*/
function backup_migrate_prune_cron() {
$query = db_select('backup_migrate_gardener', 'bmg')
->fields('bmg')
->execute();
while ($gardener = $query
->fetchAssoc()) {
backup_migrate_prune_prune($gardener['gardener_id']);
}
}
Functions
Name![]() |
Description |
---|---|
backup_migrate_prune_add_form | |
backup_migrate_prune_cron | Implementation hook_cron(). |
backup_migrate_prune_delete_gardener | |
backup_migrate_prune_delete_gardener_submit | |
backup_migrate_prune_menu | Implementation of hook_menu(). |
backup_migrate_prune_menu_submit | |
backup_migrate_prune_prune | Helper function to prune a destination |
backup_migrate_prune_prune_form | Form for Form API |
backup_migrate_prune_prune_form_submit | Submit function for backup_migrate_prune_prune_form |
backup_migrate_ui_manual_prune_list | Page callback for the prune list |