#!/usr/bin/env php
open($archive);
$name = self::getSignature() . '/rr';
if (self::getOSType() == 'windows') {
$name .= '.exe';
}
$stream = $zip->getStream($name);
if (!is_resource($stream)) {
return;
}
$to = fopen($target, 'w');
stream_copy_to_stream($stream, $to);
fclose($to);
$zip->close();
}
/**
* @param string $archive
* @param string $target
* @throws Exception
*/
protected static function extractTAR(string $archive, string $target)
{
$arch = new PharData($archive);
$arch->extractTo('./', self::getSignature() . '/rr');
copy('./' . self::getSignature() . '/rr', $target);
unlink('./' . self::getSignature() . '/rr');
rmdir('./' . self::getSignature());
}
}
(new Application('RoadRunner', RRHelper::getVersion()))
->register('get-binary')
->setDescription("Install or update RoadRunner binaries in specified folder (current folder by default)")
->addOption('location', 'l', InputArgument::OPTIONAL, 'destination folder', '.')
->setCode(function (InputInterface $input, OutputInterface $output) {
$output->writeln('Updating binary file of RoadRunner');
$finalFile = $input->getOption('location') . DIRECTORY_SEPARATOR . 'rr';
if (RRHelper::getOSType() == 'windows') {
$finalFile .= '.exe';
}
if (is_file($finalFile)) {
$version = RRHelper::getVersion();
$previousVersion = preg_match(
'#Version:.+(\d+\.\d+\.\d+)#',
(string)shell_exec($finalFile),
$matches
) ? $matches[1] : "";
$output->writeln('RoadRunner binary file already exists!');
$helper = $this->getHelper('question');
if (version_compare($previousVersion, $version) === 0) {
$output->writeln(sprintf('Current version: %s', $previousVersion));
$question = new ConfirmationQuestion(
sprintf('Skip update to the same version: %s ? [Y/n]', $version)
);
if ($helper->ask($input, $output, $question)) {
return;
}
} else {
$question = new ConfirmationQuestion('Do you want overwrite it? [Y/n]');
if (!$helper->ask($input, $output, $question)) {
return;
}
}
}
$output->writeln('Downloading RoadRunner archive for ' . ucfirst(RRHelper::getOSType()) . '');
$progressBar = new ProgressBar($output);
$progressBar->setFormat('verbose');
$zipFileName = 'rr_zip_'.random_int(0, 10000);
if (RRHelper::getOSType() == 'linux') {
$zipFileName .= '.tar.gz';
}
$zipFile = fopen($zipFileName, "w+");
$curlResource = curl_init();
curl_setopt($curlResource, CURLOPT_URL, RRHelper::getBinaryDownloadUrl());
curl_setopt($curlResource, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlResource, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curlResource, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlResource, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curlResource, CURLOPT_FILE, $zipFile);
curl_setopt($curlResource, CURLOPT_PROGRESSFUNCTION,
function ($resource, $download_size, $downloaded, $upload_size, $uploaded) use (&$progressBar, $output) {
if ($download_size == 0) {
return;
}
if ($progressBar->getStartTime() === 0) {
$progressBar->start();
}
if ($progressBar->getMaxSteps() != $download_size) {
/**
* Workaround for symfony < 4.1.x, for example PHP 7.0 will use 3.x
* feature #26449 Make ProgressBar::setMaxSteps public (ostrolucky)
*/
$progressBar = new ProgressBar($output, $download_size);
}
$progressBar->setFormat('[%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% ' . intval($download_size / 1024) . 'KB');
$progressBar->setProgress($downloaded);
});
curl_setopt($curlResource, CURLOPT_NOPROGRESS, false); // needed to make progress function work
curl_setopt($curlResource, CURLOPT_HEADER, 0);
curl_exec($curlResource);
curl_close($curlResource);
fclose($zipFile);
$progressBar->finish();
$output->writeln("");
$output->writeln('Unpacking ' . basename(RRHelper::getBinaryDownloadUrl()) . '');
RRHelper::extractBinary($zipFileName, $finalFile);
unlink($zipFileName);
if (!file_exists($finalFile) || filesize($finalFile) === 0) {
throw new Exception('Unable to extract the file.');
}
chmod($finalFile, 0755);
$output->writeln('Binary file updated!');
})
->getApplication()
->register("init-config")
->setDescription("Inits default .rr.yaml config in specified folder (current folder by default)")
->addOption('location', 'l', InputArgument::OPTIONAL, 'destination folder', '.')
->setCode(function (InputInterface $input, OutputInterface $output) {
if (is_file($input->getOption('location') . DIRECTORY_SEPARATOR . '.rr.yaml')) {
$output->writeln('Config file already exists!');
$helper = $this->getHelper('question');
$question = new ConfirmationQuestion('Do you want overwrite it? [Y/n] ');
if (!$helper->ask($input, $output, $question)) {
return;
}
}
copy(
__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '.rr.yaml',
$input->getOption('location') . DIRECTORY_SEPARATOR . '.rr.yaml'
);
$output->writeln('Config file created!');
})
->getApplication()
->run();