provision.config.inc 6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
<?php

// $Id$

/**
 * Provision configuration generation classes.
 */

class provisionConfig {
  public $template = null;
  public $data = array();
12
  public $owner = null;
13
  public $description = null;
14 15 16
  protected $append = FALSE;
  protected $mode = NULL;
  protected $group = NULL;
17

18 19 20 21 22 23 24
  function __get($name) {
    if ($this->owner) {
      return d($this->owner)->$name;
    }
  }
  
  function __construct($owner, $data = array()) {
25 26 27 28 29 30
    if (is_null($this->template)) {
      throw(exception);
    }
    if (sizeof($data)) {
      $this->data = $data;
    }
31
    $this->owner = $owner;
32 33
  }

drumm's avatar
drumm committed
34 35 36 37
  function owner() {
    return d($this->owner);
  }

38 39 40 41 42 43 44
  /**
   * process the data before writing it
   *
   * this is called right before the file is written
   *
   * this is a stub to be implemented by subclasses
   */
45 46 47 48
  function process() {
    return true;
  }

49 50 51 52 53
  /**
   * the filename where the filename is read/written from/to
   * 
   * this is a stub to be implemented by subclasses
   */
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
  function filename() {
    return false;
  }


  private function load_template() {
    $reflect = new reflectionObject($this);
    $base_dir = dirname($reflect->getFilename());

    if (isset($this->template)) {
      $file = $base_dir . '/' . $this->template;
      drush_log("Template loaded: $file");
      if (file_exists($file) && is_readable($file)) {
        return file_get_contents($file);
      }
    }
    return false;
  }


  private function render_template($template, $variables) {
    drush_errors_off();
    extract($variables, EXTR_SKIP);  // Extract the variables to a local namespace
    ob_start();                      // Start output buffering
    eval('?>'. $template);                 // Generate content
    $contents = ob_get_contents();   // Get the contents of the buffer
    ob_end_clean();                  // End buffering and discard
    drush_errors_on();
    return $contents;                // Return the contents
  }

  function write() {
    $filename = $this->filename();
drumm's avatar
drumm committed
87
    // Make directory structure if it does not exist.
88 89
    if (!provision_file()->exists(dirname($filename))->status()) {
      provision_file()->mkdir(dirname($filename))
drumm's avatar
drumm committed
90 91 92 93
        ->succeed('Created directory @path.')
        ->fail('Could not create directory @path.');
    }

94 95 96 97 98
    if ($filename && is_writeable(dirname($filename))) {
      // manipulate data before passing to template.
      $this->process();

      if ($template = $this->load_template()) {
99
        // Make sure we can write to the file
100 101
        if (!is_null($this->mode) && !($this->mode & 0200) && provision_file()->exists($filename)->status()) {
          provision_file()->chmod($filename, $this->mode | 0200)
102 103 104 105
            ->succeed('Changed permissions of @path to @perm')
            ->fail('Could not change permissions of @path to @perm');
        }

106
        provision_file()->file_put_contents($filename, $this->render_template($template, $this->data), $this->append ? FILE_APPEND : 0)
107 108 109 110
          ->succeed('Generated config ' . (empty($this->description) ? $filename : $this->description), 'success');

        // Change the permissions of the file if needed
        if (!is_null($this->mode)) {
111
          provision_file()->chmod($filename, $this->mode)
112 113 114 115
            ->succeed('Changed permissions of @path to @perm')
            ->fail('Could not change permissions of @path to @perm');
        }
        if (!is_null($this->group)) {
116
          provision_file()->chgrp($filename, $this->group)
117 118
            ->succeed('Change group ownership of @path to @gid')
            ->fail('Could not change group ownership of @path to @gid');
119
        }
120
        #provision_file()->sync($this->filename());
121 122 123 124 125
      }
    }
  }

  function unlink() {
126 127
    provision_file()->unlink($this->filename())->status();
    #provision_file()->sync($this->filename());
128 129
  }
}
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

/**
 * Specialized class to handle the creation of drushrc.php files.
 *
 * This is based on the drush_save_config code, but has been abstracted
 * for our purposes.
 */ 
class provisionConfig_drushrc extends provisionConfig {
  public $template = 'provision_drushrc.tpl.php';
  public $description = 'Drush configuration file';
  protected $mode = 0400;
  protected $context_name = 'drush';

  function filename() {
    return _drush_config_file($this->context_name);
  }

147 148
  function __construct($owner, $data = array()) {
    parent::__construct($owner, $data);
149 150
    $this->load_data();
  }
151

152
  function load_data() {
153 154 155 156 157 158 159 160 161 162 163
    // we fetch the context to pass into the template based on the context name
    $this->data = array_merge(drush_get_context($this->context_name), $this->data);
  }

  function process() {
    unset($this->data['context-path']);
    unset($this->data['config-file']);
    $this->data['option_keys'] = array_keys($this->data);
  }
}

164 165 166
/**
 * Class to write an alias records.
 */
167
class provisionConfig_drushrc_alias extends provisionConfig_drushrc {
drumm's avatar
drumm committed
168 169
  public $template = 'provision_drushrc_alias.tpl.php';

170
  /**
drumm's avatar
drumm committed
171 172 173 174
   * @param $name
   *   String '\@name' for named context.
   * @param $options
   *   Array of string option names to save.
175
   */
176 177
  function __construct($owner, $options = array()) {
    $this->owner = $owner;
drumm's avatar
drumm committed
178
    $this->data = array(
179
      'aliasname' => ltrim($owner, '@'),
180
      'options' => $options,
drumm's avatar
drumm committed
181
    );
182 183 184
  }

  function filename() {
drumm's avatar
drumm committed
185
    return drush_server_home() . '/.drush/' . $this->data['aliasname'] . '.alias.drushrc.php'; 
186 187 188
  }
}

189 190 191 192 193 194 195 196
/**
 * Server level config for drushrc.php files.
 */
class provisionConfig_drushrc_server extends provisionConfig_drushrc {
  protected $context_name = 'user';
  public $description = 'Server drush configuration';
}

197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
/**
 * Class for writing $platform/drushrc.php files.
 */
class provisionConfig_drushrc_platform extends provisionConfig_drushrc {
  protected $context_name = 'drupal';
  public $description = 'Platform Drush configuration file';
}

/**
 * Class for writing $platform/sites/$url/drushrc.php files.
 */
class provisionConfig_drushrc_site extends provisionConfig_drushrc {
  protected $context_name = 'site';
  public $template = 'provision_drushrc_site.tpl.php';
  public $description = 'Site Drush configuration file';
}