Ejemplo n.º 1
0
 /**
  * @throws \Exception
  */
 public function run()
 {
     if (!$this->command instanceof ProvisionCommand) {
         throw new \Exception("The ConfigDefaults task can only be run by the Provision command.");
     }
     $fs = Util::getFilesystem();
     $config_files = SyncManager::getRules(SyncManager::SYNC_FILE);
     $config_dirs = SyncManager::getRules(SyncManager::SYNC_DIR);
     $config_sources = array_merge(array_column($config_files, 'source'), array_column($config_dirs, 'source'));
     if ($fs->exists($config_sources)) {
         return;
     }
     $config_sources_dirs = [];
     foreach ($config_sources as $config_source) {
         $config_source_dir = dirname($config_source);
         while ($config_source_dir != '/vagrant' && !in_array($config_source_dir, $config_sources_dirs)) {
             $config_sources_dirs[] = $config_source_dir;
             $config_source_dir = dirname($config_source_dir);
         }
     }
     $fs->mkdir($config_sources_dirs, 0777, 'vagrant');
     foreach ($config_files as $file) {
         if (empty($file['default'])) {
             continue;
         }
         $target_file = $file['source'];
         $origin_file = $file['default'];
         if (!file_exists($target_file)) {
             $this->output->writeInfo("Writing default config file '{$target_file}'");
             $fs->copy($origin_file, $target_file, true, 'vagrant');
         }
     }
     foreach ($config_dirs as $dir) {
         if (empty($dir['default'])) {
             continue;
         }
         $source_dir = $dir['default'];
         $target_dir = $dir['source'];
         if (file_exists($target_dir)) {
             continue;
         }
         $this->output->writeInfo("Writing default config dir '{$target_dir}'");
         $fs->mkdir($target_dir, 0777, 'vagrant');
         $finder = new Finder();
         foreach ($finder->files()->in($source_dir)->ignoreDotFiles(false)->depth('== 0') as $origin_dir_file) {
             $origin_dir_filename = $origin_dir_file->getFilename();
             $target_dir_filepath = $target_dir . '/' . $origin_dir_filename;
             $origin_dir_filepath = $source_dir . '/' . $origin_dir_filename;
             $fs->copy($origin_dir_filepath, $target_dir_filepath, true, 'vagrant');
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * @throws \Exception
  */
 public function run()
 {
     if (!$this->command instanceof ProvisionCommand) {
         throw new \Exception("The InitialSetup task can only be run by the Provision command.");
     }
     $lock = '/etc/dashbrew/initialsetup.lock';
     if (file_exists($lock)) {
         return;
     }
     //$this->output->writeInfo("Running initial apt-get update");
     //Util::process($this->output, "apt-get -y update", ['timeout' => null]);
     $fs = Util::getFilesystem();
     $fs->touch($lock);
 }
Ejemplo n.º 3
0
 /**
  * Syncs directories files between the host and guest using bi-directional sync algorithm
  */
 protected function syncDirs()
 {
     $fs = Util::getFilesystem();
     $sync_status = [];
     if (file_exists(self::SYNC_STATUS_FILE)) {
         $sync_status = json_decode(file_get_contents(self::SYNC_STATUS_FILE), true);
     }
     $sync_status_new = [];
     $config_dirs = SyncManager::getRules(SyncManager::SYNC_DIR);
     foreach ($config_dirs as $dir) {
         if (empty($dir['path'])) {
             continue;
         }
         $source_dir = $dir['source'];
         $source_dir_owner = 'vagrant';
         $source_dir_group = 'vagrant';
         $target_dir = $dir['path'];
         $target_dir_owner = !empty($dir['owner']) ? $dir['owner'] : null;
         $target_dir_group = !empty($dir['group']) ? $dir['group'] : null;
         if ($source_dir == $target_dir) {
             continue;
         }
         $dir_sync_status = ['old' => [], 'new' => []];
         if (isset($sync_status[$target_dir])) {
             $dir_sync_status['old'] = $sync_status[$target_dir];
         }
         $finder = new Finder();
         foreach ($finder->files()->in($source_dir)->ignoreDotFiles(false)->depth('== 0') as $source_dir_file) {
             $source_dir_filename = $source_dir_file->getFilename();
             $source_dir_filepath = $source_dir . '/' . $source_dir_filename;
             $target_dir_filepath = $target_dir . '/' . $source_dir_filename;
             // Sync file changes
             if (file_exists($target_dir_filepath)) {
                 $dir_sync_status['new'][] = $source_dir_filename;
                 if (md5_file($source_dir_filepath) === md5_file($target_dir_filepath)) {
                     continue;
                 }
                 $source_dir_filetime = filemtime($source_dir_filepath);
                 $target_dir_filetime = filemtime($target_dir_filepath);
                 if ($source_dir_filetime >= $target_dir_filetime) {
                     $copy_from = $source_dir_filepath;
                     $copy_to = $target_dir_filepath;
                     $copy_owner = $target_dir_owner;
                     $copy_group = $target_dir_group;
                 } else {
                     $copy_from = $target_dir_filepath;
                     $copy_to = $source_dir_filepath;
                     $copy_owner = $source_dir_owner;
                     $copy_group = $source_dir_group;
                 }
                 $this->output->writeInfo("Syncing config file '{$source_dir_filepath}' " . ($copy_from == $source_dir_filepath ? "->" : "<-") . " '{$target_dir_filepath}'");
                 $fs->copy($copy_from, $copy_to, true, $copy_owner, $copy_group);
             } else {
                 if (in_array($source_dir_filename, $dir_sync_status['old'])) {
                     $this->output->writeInfo("Removing config file '{$source_dir_filepath}'");
                     $fs->remove($source_dir_filepath);
                 } else {
                     $dir_sync_status['new'][] = $source_dir_filename;
                     $this->output->writeInfo("Copying config file '{$source_dir_filepath}' -> '{$target_dir_filepath}'");
                     $fs->copy($source_dir_filepath, $target_dir_filepath, true, $target_dir_owner, $target_dir_group);
                 }
             }
         }
         $finder = new Finder();
         foreach ($finder->files()->in($target_dir)->ignoreDotFiles(false)->depth('== 0') as $target_dir_file) {
             $target_dir_filename = $target_dir_file->getFilename();
             $source_dir_filepath = $source_dir . '/' . $target_dir_filename;
             $target_dir_filepath = $target_dir . '/' . $target_dir_filename;
             if (in_array($target_dir_filename, $dir_sync_status['new'])) {
                 continue;
             }
             // Delete file from target dir
             if (in_array($target_dir_filename, $dir_sync_status['old'])) {
                 $this->output->writeInfo("Removing config file '{$target_dir_filepath}'");
                 $fs->remove($target_dir_filepath);
             } else {
                 $this->output->writeInfo("Copying config file '{$source_dir_filepath}' <- '{$target_dir_filepath}'");
                 $fs->copy($target_dir_filepath, $source_dir_filepath, true, $source_dir_owner, $source_dir_group);
                 $dir_sync_status['new'][] = $target_dir_filename;
             }
         }
         $sync_status_new[$target_dir] = $dir_sync_status['new'];
     }
     // Write status file
     $this->output->writeDebug("Writing config directories sync status file");
     $fs->write(self::SYNC_STATUS_FILE, json_encode($sync_status_new), 'vagrant');
 }
Ejemplo n.º 4
0
 /**
  * Manages php fpm via augeas and monit
  *
  * @param $meta
  * @throws \Exception
  */
 protected function manageFpm($meta)
 {
     if (empty($meta['fpm']['port']) && empty($meta['_old']['fpm']['port'])) {
         return;
     }
     if ($meta['installed'] && !empty($meta['fpm']['port'])) {
         $this->output->writeInfo("Checking fpm");
     } else {
         $this->output->writeInfo("Removing fpm");
     }
     $fs = Util::getFilesystem();
     $monit_conf_file = "/etc/monit/conf.d/php-{$meta['_build']}-fpm.conf";
     $apache_conf_file = "/etc/apache2/php/php-{$meta['_build']}-fpm.conf";
     if ($meta['installed'] && empty($meta['fpm']['port']) && !empty($meta['_old']['fpm']['port'])) {
         $this->stopFpm($meta['_build']);
     }
     if (!$meta['installed'] || empty($meta['fpm']['port'])) {
         if (file_exists($monit_conf_file)) {
             $this->output->writeInfo("Removing monit php-fpm config file '{$monit_conf_file}'");
             $fs->remove($monit_conf_file);
         }
         if (file_exists($apache_conf_file)) {
             $this->output->writeInfo("Removing apache php-fpm config file '{$apache_conf_file}'");
             $fs->remove($apache_conf_file);
         }
         return;
     }
     $fpm_config_file = $meta['_path'] . '/etc/php-fpm.conf';
     $fpm_config_updated_1 = Util::augeas('PHP', $fpm_config_file, 'www/listen', '127.0.0.1:' . $meta['fpm']['port']);
     $fpm_config_updated_2 = Util::augeas('PHP', $fpm_config_file, 'www/user', 'www-data');
     $fpm_config_updated_3 = Util::augeas('PHP', $fpm_config_file, 'www/group', 'www-data');
     if (0 === $fpm_config_updated_1 || 0 === $fpm_config_updated_2 || 0 === $fpm_config_updated_3) {
         $this->output->writeError("Failed to configure fpm config file '{$fpm_config_file}'");
     } else {
         if (2 === $fpm_config_updated_1 || 2 === $fpm_config_updated_2 || 2 === $fpm_config_updated_3) {
             $this->output->writeInfo("Configured fpm");
         }
     }
     $monit_conf_template = Util::renderTemplate('monit/conf.d/php-fpm.conf.php', ['build' => $meta['_build'], 'port' => $meta['fpm']['port']]);
     if (!file_exists($monit_conf_file) || md5($monit_conf_template) !== md5_file($monit_conf_file)) {
         $this->output->writeInfo("Writing monit php-fpm config file '{$monit_conf_file}'");
         $fs->write($monit_conf_file, $monit_conf_template, 'root');
     }
     $apache_conf_template = Util::renderTemplate('apache/php/php-fpm.conf.php', ['build' => $meta['_build'], 'port' => $meta['fpm']['port']]);
     if (!file_exists($apache_conf_file) || md5($apache_conf_template) !== md5_file($apache_conf_file)) {
         $this->output->writeInfo("Writing apache php-fpm config file '{$apache_conf_file}'");
         $fs->write($apache_conf_file, $apache_conf_template, 'root');
     }
     if (!isset($meta['fpm']['autostart']) || $meta['fpm']['autostart']) {
         ServiceManager::addService("php-{$meta['_build']}-fpm");
     }
 }
Ejemplo n.º 5
0
 /**
  * Manages project vhost
  *
  * @param $action
  * @param $id
  * @param $project
  * @throws \Exception
  */
 protected function processVhost($action, $id, $project)
 {
     static $verbs;
     if (null === $verbs) {
         $verbs = ['delete' => ['Removing', 'remove'], 'modify' => ['Updating', 'update'], 'create' => ['Writing', 'write'], 'skip' => ['Skipping']];
         $verbs['check'] = $verbs['modify'];
     }
     $vhost = array_merge(['docroot' => '${dir}', 'servername' => $id, 'options' => ['Indexes', 'FollowSymLinks'], 'override' => ['All'], 'directoryindex' => '', 'ssl' => false, 'ssl_cert' => '/etc/ssl/certs/ssl-cert-snakeoil.pem', 'ssl_key' => '/etc/ssl/private/ssl-cert-snakeoil.key', 'ssl_certs_dir' => '/etc/ssl/certs', 'php-fpm' => ''], $project['vhost']);
     $vhost_file = "/etc/apache2/sites-enabled/{$id}.conf";
     $vhost_ssl_file = "/etc/apache2/sites-enabled/{$id}-ssl.conf";
     if ($action == 'skip') {
         if (!file_exists($vhost_file) || $vhost['ssl'] && !file_exists($vhost_ssl_file)) {
             $action = 'create';
         } else {
             $this->output->writeDebug("{$verbs[$action][0]} apache vhost for '{$id}'");
             if ($vhost['ssl']) {
                 $this->output->writeDebug("{$verbs[$action][0]} apache ssl vhost for '{$id}'");
             }
             return;
         }
     }
     $fs = Util::getFilesystem();
     if ($action == 'delete') {
         if (file_exists($vhost_file)) {
             $this->output->writeInfo("{$verbs[$action][0]} apache vhost for '{$id}'");
             $fs->remove($vhost_file);
         }
         if (file_exists($vhost_ssl_file)) {
             $this->output->writeInfo("{$verbs[$action][0]} apache ssl vhost for '{$id}'");
             $fs->remove($vhost_ssl_file);
         }
         return;
     }
     if (!$vhost['ssl'] && file_exists($vhost_ssl_file)) {
         $this->output->writeInfo("{$verbs['delete'][0]} apache ssl vhost for '{$id}'");
         $fs->remove($vhost_ssl_file);
     }
     // Defauly vhost directory
     if (empty($vhost['directories'])) {
         $vhost['directories'] = [['provider' => 'directory', 'path' => $vhost['docroot'], 'options' => $vhost['options'], 'allow_override' => $vhost['override'], 'directoryindex' => $vhost['directoryindex'], 'require' => 'all granted']];
     }
     if (!empty($project['php'])) {
         $vhost = $this->__setVhostFpmInclude($id, $project, $vhost);
     }
     foreach ($vhost['directories'] as $key => $dir) {
         if (empty($dir['path']) || empty($dir['provider'])) {
             unset($vhost['directories'][$key]);
             continue;
         }
         if (!preg_match('(directory|location|files)', $dir['provider'])) {
             $dir['provider'] = 'directory';
         }
         $vhost['directories'][$key]['provider'] = ucfirst(str_replace('match', 'Match', $dir['provider']));
     }
     $vhost['serveradmin'] = "admin@{$vhost['servername']}";
     $vhost['port'] = '80';
     $vhost['access_log'] = "/var/log/apache2/vhost-{$id}.access.log";
     $vhost['error_log'] = "/var/log/apache2/vhost-{$id}.error.log";
     $vhost = $this->__replaceVhostVars($vhost, $project['_path']);
     $vhost_file_content = Util::renderTemplate('apache/vhost.php', ['vhost' => $vhost, '_project_id' => $id, '_project_file_path' => $project['_path']]);
     $vhost_file_save = false;
     if (!file_exists($vhost_file) || md5($vhost_file_content) !== md5_file($vhost_file)) {
         $vhost_file_save = true;
     }
     if ($vhost_file_save) {
         $this->output->writeInfo("{$verbs[$action][0]} apache vhost file for '{$id}'");
         $fs->write($vhost_file, $vhost_file_content, 'root');
     } else {
         $this->output->writeDebug("{$verbs['skip'][0]} {$verbs[$action][0]} apache vhost for '{$id}'");
     }
     if ($vhost['ssl']) {
         $vhost_ssl = $vhost;
         $vhost_ssl['port'] = '443';
         $vhost_ssl['access_log'] = "/var/log/apache2/vhost-{$id}-ssl.access.log";
         $vhost_ssl['error_log'] = "/var/log/apache2/vhost-{$id}-ssl.error.log";
         $vhost_ssl_file_content = Util::renderTemplate('apache/vhost.php', ['vhost' => $vhost_ssl, '_project_id' => $id, '_project_file_path' => $project['_path']]);
         $vhost_ssl_file_save = false;
         if (!file_exists($vhost_ssl_file) || md5($vhost_ssl_file_content) !== md5_file($vhost_ssl_file)) {
             $vhost_ssl_file_save = true;
         }
         if ($vhost_ssl_file_save) {
             $this->output->writeInfo("{$verbs[$action][0]} apache ssl vhost file for '{$id}'");
             $fs->write($vhost_ssl_file, $vhost_ssl_file_content, 'root');
         } else {
             $this->output->writeDebug("{$verbs['skip'][0]} {$verbs[$action][0]} apache ssl vhost for '{$id}'");
         }
     }
 }
Ejemplo n.º 6
0
 /**
  * @throws \Exception
  */
 public function run()
 {
     if (!$this->command instanceof ProvisionCommand) {
         throw new \Exception("The Init task can only be run by the Provision command.");
     }
     // Check box version
     if (!file_exists('/etc/dashbrew/.version')) {
         throw new \Exception("Unable to find base box version file.");
     }
     $box_version = file_get_contents('/etc/dashbrew/.version');
     if (empty($box_version)) {
         throw new \Exception("Invalid base box version file.");
     }
     if (false === strpos($box_version, DASHBREW_BASEBOX_VERSION, 0)) {
         throw new \Exception("Incompatible base box version ({$box_version}). Dashbrew requires a base box version " . DASHBREW_BASEBOX_VERSION . ".x");
     }
     $this->output->writeDebug("Checking for available " . $box_version . " patches");
     $box_patch_file = '/etc/dashbrew/.patch';
     $box_patch_md5 = null;
     if (file_exists($box_patch_file)) {
         $box_patch_md5 = file_get_contents($box_patch_file);
     }
     $available_patch = file_get_contents('https://raw.githubusercontent.com/mdkholy/dashbrew-basebox/master/patches/' . $box_version . '.sh');
     $apply_patch = false;
     if (!empty($available_patch)) {
         $available_patch_md5 = md5($available_patch);
         if ($box_patch_md5 != $available_patch_md5) {
             $apply_patch = true;
         }
     }
     if ($apply_patch) {
         $this->output->writeInfo("An update patch is available for your box. Updating...");
         $fs = Util::getFilesystem();
         $exec_patch_file = '/tmp/dashbrew-basebox-patch.sh';
         $fs->write($exec_patch_file, $available_patch, 'root');
         $fs->chmod($exec_patch_file, 0755);
         $proc = Util::Process($this->output, "sudo bash {$exec_patch_file}", ['timeout' => null]);
         if ($proc->isSuccessful()) {
             $this->output->writeInfo("Update patch has been applied successfully");
         } else {
             $this->output->writeError("Error occured while applying update patch");
         }
         $fs->remove($exec_patch_file);
         $fs->write($box_patch_file, $available_patch_md5);
         $fs->chmod($box_patch_file, 0644);
     }
     // Parse & initialize config.yaml file
     if (file_exists(Config::CONFIG_FILE)) {
         $this->output->writeInfo("Initializing environment.yaml");
     } else {
         $this->output->writeInfo("Provisioning without environment.yaml config file");
     }
     Config::init();
     if (Config::get('debug')) {
         $this->output->setVerbosity(Output::VERBOSITY_DEBUG);
     }
     // Initialize config files and directories
     $this->output->writeDebug("Initializing config files");
     $config_files = [['path' => '/etc/monit/monitrc', 'source' => '/vagrant/config/monit/monitrc', 'default' => '/etc/monit/monitrc', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/apache2/apache2.conf', 'source' => '/vagrant/config/apache/apache.conf', 'default' => '/etc/apache2/apache2.conf', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/fpm/php-fpm.conf', 'source' => '/vagrant/config/php/fpm/php-fpm.conf', 'default' => '/etc/php5/fpm/php-fpm.conf', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/fpm/php.ini', 'source' => '/vagrant/config/php/fpm/php.ini', 'default' => '/etc/php5/fpm/php.ini', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/mysql/my.cnf', 'source' => '/vagrant/config/mysql/my.cnf', 'default' => '/etc/mysql/my.cnf', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/cli/php.ini', 'source' => '/vagrant/config/php/cli/php.ini', 'default' => '/etc/php5/cli/php.ini', 'owner' => 'root', 'group' => 'root'], ['path' => '/opt/phpbrew/config.yaml', 'source' => '/vagrant/config/phpbrew/config.yaml', 'default' => '/opt/phpbrew/config.yaml', 'owner' => 'vagrant', 'group' => 'vagrant'], ['path' => '/usr/share/phpmyadmin/config.inc.php', 'source' => '/vagrant/config/phpmyadmin/config.inc.php', 'default' => '/usr/share/phpmyadmin/config.inc.php', 'owner' => 'vagrant', 'group' => 'www-data']];
     $config_dirs = [['path' => '/home/vagrant', 'source' => '/vagrant/config/home', 'default' => '/home/vagrant', 'owner' => 'vagrant', 'group' => 'vagrant'], ['path' => '/etc/monit/conf.d', 'source' => '/vagrant/config/monit/conf.d', 'default' => '/etc/monit/conf.d', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/cli/conf.d', 'source' => '/vagrant/config/php/cli/conf.d', 'default' => '/etc/php5/cli/conf.d', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/fpm/conf.d', 'source' => '/vagrant/config/php/fpm/conf.d', 'default' => '/etc/php5/fpm/conf.d', 'owner' => 'root', 'group' => 'root'], ['path' => '/etc/php5/fpm/pool.d', 'source' => '/vagrant/config/php/fpm/pool.d', 'default' => '/etc/php5/fpm/pool.d', 'owner' => 'root', 'group' => 'root']];
     $installed_phps = Util::getInstalledPhps();
     $phps = Config::get('php::builds');
     foreach ($phps as $build => $meta) {
         if (!in_array($build, $installed_phps)) {
             continue;
         }
         $config_dirs[] = ['path' => "/opt/phpbrew/php/{$build}/var/db", 'source' => "/vagrant/config/phpbrew/{$build}/conf.d", 'default' => "/opt/phpbrew/php/{$build}/var/db", 'owner' => 'vagrant', 'group' => 'vagrant'];
         $config_files[] = ['path' => "/opt/phpbrew/php/{$build}/etc/php.ini", 'source' => "/vagrant/config/phpbrew/{$build}/php.ini", 'default' => "/opt/phpbrew/php/{$build}/etc/php.ini", 'owner' => 'vagrant', 'group' => 'vagrant'];
         $config_files[] = ['path' => "/opt/phpbrew/php/{$build}/etc/php-fpm.conf", 'source' => "/vagrant/config/phpbrew/{$build}/php-fpm.conf", 'default' => "/opt/phpbrew/php/{$build}/etc/php-fpm.conf", 'owner' => 'vagrant', 'group' => 'vagrant'];
     }
     foreach ($config_files as $config_file) {
         SyncManager::addRule(SyncManager::SYNC_FILE, $config_file);
     }
     foreach ($config_dirs as $config_dir) {
         SyncManager::addRule(SyncManager::SYNC_DIR, $config_dir);
     }
     $services = ['apache', 'mysql', 'php-system-fpm', 'mailcatcher'];
     foreach ($services as $service) {
         ServiceManager::addService($service);
     }
 }