provision.inc 6.36 KB
Newer Older
1
<?php
2
// $Id$
3

4
5
6
7
8
9
10
11
12
/**
 * @file
 * The provisioning framework API.
 *
 * API functions that are used by the provisioning framework to provide structure to the provisioning modules.
 *
 * @see errorhandling
 * @see logging
 * @see sitedata
13
 * @see provisionvalues
14
15
 */

16
17
drush_errors_on();

18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @defgroup sitedata Site data management utility functions.
 * @{
 * The provision framework maintains a site.php file in the sites directory, to maintain additional
 * information from the front end, as well as providing a change history of setting changes. 
 *
 * These functions load, save and manage changes made to the site data. This data has diagnostic and infrastructure
 * values, that allow sites to be more easily moved between different provisioned platforms.
 */


/**
30
 * Save modified options to the drushrc.php file
31
 */
32
function provision_save_site_data() {
33
  if (!drush_get_error()) {
34
    $config = new provisionConfig_drushrc_site();
35
    $config->write();
36
  }
37
38
}

39

40
41
42
43
44
45
46
/**
 * Save modified options to the drushrc.php file
 */
function provision_save_platform_data() {
  if (!drush_get_error()) {
    $config = new provisionConfig_drushrc_platform();
    $config->write();
47
48
49
  }
}

50
51
52
53
54
55
56
57
58
59
/**
 * Save modified options to the drushrc.php file
 */
function provision_save_server_data() {
  if (!drush_get_error()) {
    $config = new provisionConfig_drushrc_server();
    $config->write();
  }
}

60
61
62
63
/**
 * @} End of "defgroup sitedata".
 */

64
65
66
67
/**
 * Remove files or directories, recursively
 *
 * This was taken from imagecache.module, with slight modifications:
68
 * - carry error codes along the way (returns TRUE only if all operations return TRUE)
69
70
71
72
 * - remove any type of files encountered (not just links, files and dirs)
 * - safety checking since we don't necessarly trust the removed files
 */
function _provision_recursive_delete($path) {
anarcat's avatar
anarcat committed
73
  $ret = 1;
74
75
  if (is_dir($path)) {
    $d = dir($path);
76
    while (($entry = $d->read()) !== FALSE) {
77
78
      if ($entry == '.' || $entry == '..') continue;
      $entry_path = $path .'/'. $entry;
79
      if (_provision_file_check_location($entry_path, $path)) {
80
        $ret = _provision_recursive_delete($entry_path);
81
82
      } 
      else {
83
84
85
86
        $ret = 0;
      }
    }

87
88
89
90
    $rm = provision_service('file')->rmdir($path)
      ->succeed('Deleting @path directory successful.')
      ->fail('Deleting @path directory failed.')
      ->status();
91
92
93
94

    $ret = $ret && $rm;
  }
  else {
95
96
97
    $rm = provision_service('file')->unlink($path)
      ->fail('Deleting @path file failed.')
      ->status();
anarcat's avatar
anarcat committed
98
    $ret = $ret && $rm;
99
100
101
102
  }
  return $ret;
}

103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function _provision_file_check_location($source, $directory = '') {
  $check = realpath($source);
  if ($check) {
    $source = $check;
  }
  else {
    // This file does not yet exist
    $source = realpath(dirname($source)) .'/'. basename($source);
  }
  $directory = realpath($directory);
  if ($directory && strpos($source, $directory) !== 0) {
    return 0;
  }
  return $source;
}

119
120
/**
 * Wrapper around drush_shell_exec to provide sprintf functionality with some more safety.
121
122
123
 *
 * @TODO: fix this so we can get error codes and the return values. drush_shell_exec is too
 *        limited
124
125
126
127
 */
function provision_shell_exec() {
  $args = func_get_args();
  
128
  //do not change the command itself, just the parameters.
129
130
131
  for ($x = 1; $x < sizeof($args); $x++) {
    $args[$x] = escapeshellcmd($args[$x]);
  }
132
  $command = call_user_func_array('sprintf', $args);
133
  drush_log($command); 
134
  return drush_shell_exec($command);
135
136
}

137
/**
138
 * Check whether a user is a member of a group.
139
 *
140
141
142
143
144
145
146
 * @param user
 *   username or user id of user.
 * @param group
 *   groupname or group id of group.
 *
 * @return
 *   Boolean. True if user does belong to group, 
147
 *   and FALSE if the user does not belong to the group, or either the user or group do not exist.
148
 */
149
150
151
152
153
154
155
156
function provision_user_in_group($user, $group) {
  // TODO: make these singletons with static variables for caching.
  $user = provision_posix_username($user);
  $group = provision_posix_groupname($group);
  if ($user && $group) {
    $info = posix_getgrnam($group);
    if (in_array($user, $info['members'])) {
      return TRUE;
157
158
    }
  }
159
  return FALSE;
160
161
162
163
164
165
}

/**
 * Return the valid system username for $user.
 *
 * @return
166
 *   Returns the username if found, otherwise returns FALSE
167
168
169
 */
function provision_posix_username($user) {
  // TODO: make these singletons with static variables for caching.
170
  // we do this both ways, so that the function returns NULL if no such user was found.
171
172
173
174
  if (is_numeric($user)) {
    $info = posix_getpwuid($user);
    $user = $info['name'];
  }
175
  else {
176
177
178
179
180
181
182
183
184
185
    $info = posix_getpwnam($user);
    $user = $info['name'];
  }
  return $user;
}

/**
 * Return the valid system groupname for $group.
 *
 * @return
186
 *   Returns the groupname if found, otherwise returns FALSE
187
188
189
 */
function provision_posix_groupname($group) {
  // TODO: make these singletons with static variables for caching.
190
  // we do this both ways, so that the function returns NULL if no such user was found.
191
  if (is_numeric($group)) {
192
193
194
195
196
197
    $info = posix_getgrgid($group);
    $group = $info['name'];
  }
  else {
    $info = posix_getgrnam($group);
    $group = $info['name'];
198
  }
199
  return $group;
200
}
201

202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
function provision_password($length = 10) {
  // This variable contains the list of allowable characters for the
  // password. Note that the number 0 and the letter 'O' have been
  // removed to avoid confusion between the two. The same is true
  // of 'I', 1, and 'l'.
  $allowable_characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';

  // Zero-based count of characters in the allowable list:
  $len = strlen($allowable_characters) - 1;

  // Declare the password as a blank string.
  $pass = '';

  // Loop the number of times specified by $length.
  for ($i = 0; $i < $length; $i++) {

    // Each iteration, pick a random character from the
    // allowable string and append it to the password:
    $pass .= $allowable_characters[mt_rand(0, $len)];
  }

  return $pass;
}
225

226
227
228
229
230
231
232
233
234
235
236
237
238
/**
 * This is a helper function which changes deeply nested objects into arrays
 *
 * This helps get past the face that objects are not simple to work with, or
 * save in context files.
 *
 * This function 'misuses' a side effect of the json_decode function's second
 * parameter. As this is done in C, and the structures we are manipulating
 * aren't that large, it should be performant enough.
 */
function _scrub_object($input) {
  return json_decode(json_encode($input), TRUE);
}