/** * Copies the passed OS specific resource file to the target directory. * * @param string $os The OS we want to copy the files for * @param string $resource The resource file we want to copy * @param boolean $override TRUE if the file should be overwritten if exists, else FALSE * @param integer $mode The mode of the target file * * @return void */ public static function copyOsSpecificResource($os, $resource, $override = false, $mode = 0644) { // we need the installation directory $installDir = Setup::getValue(SetupKeys::INSTALL_DIR); // prepare source and target directory $source = Setup::prepareOsSpecificPath(sprintf('%s/resources/os-specific/%s/%s', $installDir, $os, $resource)); $target = Setup::prepareOsSpecificPath(sprintf('%s/%s', $installDir, $resource)); // query whether we've to override the file if ($override === false && is_file($target) === true) { return; } // prepare the target directory Setup::prepareDirectory($target); // copy the file to the target directory copy($source, $target); // set the correct mode for the file Setup::changeFilePermissions($target, $mode); }
/** * Switches the setup mode to the passed value. * * @param string $newMode The mode to switch to * @param string $configurationFilename The path of the configuration filename * @param string $user The name of the user who started the application server * * @return void * @throws \Exception Is thrown for an invalid setup mode passed */ public function switchSetupMode($newMode, $configurationFilename, $user) { // log a message that we switch setup mode now $this->getInitialContext()->getSystemLogger()->info(sprintf('Now switch mode to %s!!!', $newMode)); // init setup context Setup::prepareContext($this->getBaseDirectory()); // init variable for the group $group = null; // pattern to replace the user in the etc/appserver/appserver.xml file $configurationUserReplacePattern = '/(<appserver[^>]+>[^<]+<params>.*<param name="user[^>]+>)([^<]+)/s'; // check setup modes switch ($newMode) { // prepares everything for developer mode case ContainerService::SETUP_MODE_DEV: // get defined group from configuration $group = Setup::getValue(SetupKeys::GROUP); // replace user in configuration file file_put_contents($configurationFilename, preg_replace($configurationUserReplacePattern, '${1}' . $user, file_get_contents($configurationFilename))); // add everyone write access to configuration files for dev mode FileSystem::recursiveChmod($this->getEtcDir(), 0777, 0777); break; // prepares everything for production mode // prepares everything for production mode case ContainerService::SETUP_MODE_PROD: // get defined user and group from configuration $user = Setup::getValue(SetupKeys::USER); $group = Setup::getValue(SetupKeys::GROUP); // replace user to be same as user in configuration file file_put_contents($configurationFilename, preg_replace($configurationUserReplacePattern, '${1}' . $user, file_get_contents($configurationFilename))); // set correct file permissions for configurations FileSystem::recursiveChmod($this->getEtcDir()); break; // prepares everything for first installation which is default mode // prepares everything for first installation which is default mode case ContainerService::SETUP_MODE_INSTALL: // load the flag marked the server as installed $isInstalledFlag = $this->getIsInstalledFlag(); // first check if it is a fresh installation if ($isInstalledFlag->isReadable() === false) { // set example app dodeploy flag to be deployed for a fresh installation touch($this->getDeployDir('example.phar.dodeploy')); } // create is installed flag for prevent further setup install mode calls touch($isInstalledFlag); // get defined user and group from configuration $user = Setup::getValue(SetupKeys::USER); $group = Setup::getValue(SetupKeys::GROUP); // set correct file permissions for configurations FileSystem::recursiveChmod($this->getEtcDir()); break; default: throw new \Exception(sprintf('Invalid setup mode %s given', $newMode)); } // check if user and group is set if (!is_null($user) && !is_null($group)) { // get needed files as accessable for all root files remove "." and ".." from the list $rootFiles = scandir($this->getBaseDirectory()); // iterate all files foreach ($rootFiles as $rootFile) { // we want just files on root dir if (is_file($rootFile) && !in_array($rootFile, array('.', '..'))) { FileSystem::chmod($rootFile, 0644); FileSystem::chown($rootFile, $user, $group); } } // ... and change own and mod of following directories FileSystem::chown($this->getBaseDirectory(), $user, $group); FileSystem::chown($this->getWebappsDir(), $user, $group); FileSystem::recursiveChown($this->getTmpDir(), $user, $group); FileSystem::recursiveChmod($this->getTmpDir()); FileSystem::recursiveChown($this->getDeployDir(), $user, $group); FileSystem::recursiveChmod($this->getDeployDir()); FileSystem::recursiveChown($this->getBaseDirectory('resources'), $user, $group); FileSystem::recursiveChmod($this->getBaseDirectory('resources')); FileSystem::recursiveChown($this->getBaseDirectory('src'), $user, $group); FileSystem::recursiveChmod($this->getBaseDirectory('src')); FileSystem::recursiveChown($this->getBaseDirectory('var'), $user, $group); FileSystem::recursiveChmod($this->getBaseDirectory('var')); FileSystem::recursiveChown($this->getBaseDirectory('tests'), $user, $group); FileSystem::recursiveChmod($this->getBaseDirectory('tests')); FileSystem::recursiveChown($this->getBaseDirectory('vendor'), $user, $group); FileSystem::recursiveChmod($this->getBaseDirectory('vendor')); // make server.php executable FileSystem::chmod($this->getBaseDirectory('server.php'), 0755); // log a message that we successfully switched to the new setup mode $this->getInitialContext()->getSystemLogger()->info(sprintf("Setup for mode '%s' done successfully!", $newMode)); } else { throw new \Exception('No user or group given'); } }