/** * 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"); } }
/** * @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); } }