summaryrefslogtreecommitdiffstats
path: root/core/modules/update/update.install
blob: 9ff39d126b05b33591c1d3aab6cfb750d40d1cfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?php

/**
 * @file
 * Install, update and uninstall functions for the update module.
 */

/**
 * Implements hook_requirements().
 *
 * @return
 *   An array describing the status of the site regarding available updates.
 *   If there is no update data, only one record will be returned, indicating
 *   that the status of core can't be determined. If data is available, there
 *   will be two records: one for core, and another for all of contrib
 *   (assuming there are any contributed modules or themes enabled on the
 *   site). In addition to the fields expected by hook_requirements ('value',
 *   'severity', and optionally 'description'), this array will contain a
 *   'reason' attribute, which is an integer constant to indicate why the
 *   given status is being returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or
 *   UPDATE_UNKNOWN). This is used for generating the appropriate e-mail
 *   notification messages during update_cron(), and might be useful for other
 *   modules that invoke update_requirements() to find out if the site is up
 *   to date or not.
 *
 * @see _update_message_text()
 * @see _update_cron_notify()
 */
function update_requirements($phase) {
  $requirements = array();
  if ($phase == 'runtime') {
    if ($available = update_get_available(FALSE)) {
      module_load_include('inc', 'update', 'update.compare');
      $data = update_calculate_project_data($available);
      // First, populate the requirements for core:
      $requirements['update_core'] = _update_requirement_check($data['drupal'], 'core');
      // We don't want to check drupal a second time.
      unset($data['drupal']);
      if (!empty($data)) {
        // Now, sort our $data array based on each project's status. The
        // status constants are numbered in the right order of precedence, so
        // we just need to make sure the projects are sorted in ascending
        // order of status, and we can look at the first project we find.
        uasort($data, '_update_project_status_sort');
        $first_project = reset($data);
        $requirements['update_contrib'] = _update_requirement_check($first_project, 'contrib');
      }
    }
    else {
      $requirements['update_core']['title'] = t('Drupal core update status');
      $requirements['update_core']['value'] = t('No update data available');
      $requirements['update_core']['severity'] = REQUIREMENT_WARNING;
      $requirements['update_core']['reason'] = UPDATE_UNKNOWN;
      $requirements['update_core']['description'] = _update_no_data();
    }
  }
  return $requirements;
}

/**
 * Implements hook_schema().
 */
function update_schema() {
  $schema['cache_update'] = drupal_get_schema_unprocessed('system', 'cache');
  $schema['cache_update']['description'] = 'Cache table for the Update module to store information about available releases, fetched from central server.';
  return $schema;
}

/**
 * Implements hook_install().
 */
function update_install() {
  $queue = queue('update_fetch_tasks', TRUE);
  $queue->createQueue();
}

/**
 * Implements hook_uninstall().
 */
function update_uninstall() {
  // Clear any variables that might be in use
  $variables = array(
    'update_check_frequency',
    'update_fetch_url',
    'update_last_check',
    'update_notification_threshold',
    'update_notify_emails',
    'update_max_fetch_attempts',
    'update_max_fetch_time',
  );
  foreach ($variables as $variable) {
    variable_del($variable);
  }
  $queue = queue('update_fetch_tasks');
  $queue->deleteQueue();
}

/**
 * Private helper method to fill in the requirements array.
 *
 * This is shared for both core and contrib to generate the right elements in
 * the array for hook_requirements().
 *
 * @param $project
 *  Array of information about the project we're testing as returned by
 *  update_calculate_project_data().
 * @param $type
 *  What kind of project is this ('core' or 'contrib').
 *
 * @return
 *  An array to be included in the nested $requirements array.
 *
 * @see hook_requirements()
 * @see update_requirements()
 * @see update_calculate_project_data()
 */
function _update_requirement_check($project, $type) {
  $requirement = array();
  if ($type == 'core') {
    $requirement['title'] = t('Drupal core update status');
  }
  else {
    $requirement['title'] = t('Module and theme update status');
  }
  $status = $project['status'];
  if ($status != UPDATE_CURRENT) {
    $requirement['reason'] = $status;
    $requirement['description'] = _update_message_text($type, $status, TRUE);
    $requirement['severity'] = REQUIREMENT_ERROR;
  }
  switch ($status) {
    case UPDATE_NOT_SECURE:
      $requirement_label = t('Not secure!');
      break;
    case UPDATE_REVOKED:
      $requirement_label = t('Revoked!');
      break;
    case UPDATE_NOT_SUPPORTED:
      $requirement_label = t('Unsupported release');
      break;
    case UPDATE_NOT_CURRENT:
      $requirement_label = t('Out of date');
      $requirement['severity'] = REQUIREMENT_WARNING;
      break;
    case UPDATE_UNKNOWN:
    case UPDATE_NOT_CHECKED:
    case UPDATE_NOT_FETCHED:
      $requirement_label = isset($project['reason']) ? $project['reason'] : t('Can not determine status');
      $requirement['severity'] = REQUIREMENT_WARNING;
      break;
    default:
      $requirement_label = t('Up to date');
  }
  if ($status != UPDATE_CURRENT && $type == 'core' && isset($project['recommended'])) {
    $requirement_label .= ' ' . t('(version @version available)', array('@version' => $project['recommended']));
  }
  $requirement['value'] = l($requirement_label, update_manager_access() ? 'admin/reports/updates/update' : 'admin/reports/updates');
  return $requirement;
}