pgo/cases/pgo01org/TrainingCaseHandler.php (106 lines of code) (raw):

<?php namespace pgo01org; use SDK\Build\PGO\Abstracts; use SDK\Build\PGO\Interfaces; use SDK\Build\PGO\Config; use SDK\Build\PGO\PHP; use SDK\Exception; use SDK\Build\PGO\Tool; class TrainingCaseHandler extends Abstracts\TrainingCase implements Interfaces\TrainingCase { protected $base; protected $nginx; protected $maria; protected $php; protected $max_runs = 12; public function __construct(Config $conf, ?Interfaces\Server $nginx, ?Interfaces\Server\DB $maria) { if (!$nginx) { throw new Exception("Invalid NGINX object"); } $this->conf = $conf; $this->base = $this->conf->getCaseWorkDir($this->getName()); $this->nginx = $nginx; $this->maria = $maria; $this->php = $nginx->getPhp(); } public function getName() : string { return __NAMESPACE__; } public function getJobFilename() : string { return $this->conf->getJobDir() . DIRECTORY_SEPARATOR . $this->getName() . ".txt"; } protected function getToolFn() : string { return $this->conf->getToolsDir() . DIRECTORY_SEPARATOR . "wp-cli.phar"; } protected function setupDist() : void { $cmd_path_arg = "--path=" . $this->base; if (!is_dir($this->base)) { echo "Setting up " . $this->getName() . " in '{$this->base}'\n"; /* XXX Use host PHP for this. */ $php = new PHP\CLI($this->conf); $php->exec($this->getToolFn() . " core download --force $cmd_path_arg"); unset($php); } $http_port = $this->getHttpPort(); $http_host = $this->getHttpHost(); $db_port = $this->getDbPort(); $db_host = $this->getDbHost(); $db_user = $this->getDbUser(); $db_pass = $this->getDbPass(); $vars = array( $this->conf->buildTplVarName($this->getName(), "docroot") => str_replace("\\", "/", $this->base), ); $tpl_fn = $this->conf->getCasesTplDir($this->getName()) . DIRECTORY_SEPARATOR . "nginx.partial.conf"; $this->nginx->addServer($tpl_fn, $vars); $php = new PHP\CLI($this->conf); $this->maria->up(); $this->nginx->up(); // $this->maria->query("DROP DATABASE IF EXISTS " . $this->getName()); // $this->maria->query("CREATE DATABASE " . $this->getName()); $htdocs = $this->conf->getHtdocs($this->getName()); $fl = $htdocs . DIRECTORY_SEPARATOR . "constants.php"; $constants = file_get_contents($fl); $constants = preg_replace(",define\('DB_USER'.+,", "define('DB_USER', '$db_user');", $constants); $constants = preg_replace(",define\('DB_PASSWORD'.+,", "define('DB_PASSWORD', '$db_pass');", $constants); $constants = preg_replace(",define\('DB_NAME'.+,", "define('DB_NAME', '" . $this->getName() . "');", $constants); $constants = preg_replace(",define\('DB_HOST'.+,", "define('DB_HOST', '$db_host:$db_port');", $constants); file_put_contents($fl, $constants); // work around <https://github.com/Microsoft/php-sdk-binary-tools/issues/51> $fl = $htdocs . DIRECTORY_SEPARATOR . "class.php"; $class = file_get_contents($fl); $class = preg_replace(",function Student,", "function __construct", $class); $class = preg_replace(",function Faculty,", "function __construct", $class); file_put_contents($fl, $class); // patch <https://github.com/intel/php_pgo_training_scripts/pull/4> $fl = $htdocs . DIRECTORY_SEPARATOR . "standard_calls.php"; $standard_calls = file_get_contents($fl); $standard_calls = preg_replace(",parse_str\(\\\$var1\),", "parse_str(\$var1, \$dummy)", $standard_calls); file_put_contents($fl, $standard_calls); //$php->exec($cmd, NULL, $env); /* TODO check status or switch to cli. */ $out = file_get_contents("http://$http_host:$http_port/init.php"); echo $out, PHP_EOL; $this->nginx->down(true); $this->maria->down(true); } public function setupUrls() { $url = "http://" . $this->getHttpHost() . ":" . $this->getHttpPort(); echo "Generating training urls.\n"; $fn = $this->getJobFilename(); if (strlen($url) !== file_put_contents($fn, $url)) { throw new Exception("Couldn't write '$fn'."); } } public function prepareInit(Tool\PackageWorkman $pw, bool $force = false) : void { $url = $this->conf->getSectionItem($this->getName(), "pgo01org_zip_url"); $pw->fetchAndUnzip($url, "php_pgo_training_scripts_01org.zip", $this->conf->getHtdocs(), "pgo01org", $force); } public function init() : void { echo "Initializing " . $this->getName() . ".\n"; $this->setupDist(); $this->setupUrls(); echo $this->getName() . " initialization done.\n"; echo $this->getName() . " site configured to run under " . $this->getHttpHost() . ":" . $this->getHttpPort() . "\n"; } }