<?php declare(strict_types=1); use Airship\Engine\Continuum\Installers\{ Cabin, Gadget, Motif }; use Airship\Engine\State; use Airship\Engine\Contract\Never; use ParagonIE\ConstantTime\Binary; require_once \dirname(__DIR__).'/bootstrap.php'; /** * Show the usage */ function usage(): Never { echo 'Command Line Extension Installer - Usage:', "\n"; echo 'To download from the Internet:', "\n\t"; echo 'install.sh [type] [supplier]/[package]', "\n"; echo 'To bypass all security:', "\n\t"; echo 'install.sh --bypass-security [type] [supplier]/[package]', "\n"; echo 'To install from a local file:', "\n\t"; echo 'install.sh [type] [supplier]/[package] [source file] [version identifier]', "\n"; exit(0); } /** * Request a value. * @param string $text * @return string */ function prompt(string $text = '') { static $fp = null; if ($fp === null) { $fp = \fopen('php://stdin', 'r'); } echo $text; return Binary::safeSubstr(\fgets($fp), 0, -1); } /* ========================================================================= */ /* # Argument parsing # */ /* ========================================================================= */ $args = \array_slice($argv, 1); $type = \array_shift($args) ?? usage(); if ($type === '--bypass-security') { $bypassSecurity = true; $type = \array_shift($args) ?? usage(); } else { $bypassSecurity = false; } $what = \array_shift($args) ?? usage(); $source = \array_shift($args) ?? ''; $version = \array_shift($args) ?? ''; list($supplier, $package) = \explode('/', $what); if (empty($supplier) || empty($package)) { usage(); } /* ========================================================================= */ /* # Installing # */ /* ========================================================================= */ $state = State::instance(); $installerArgs = [ $state->hail, $supplier, $package ]; switch (\strtolower($type)) { case 'cabin': $installer = new Cabin(...$installerArgs); break; case 'gadget': $installer = new Gadget(...$installerArgs); break; case 'motif': $installer = new Motif(...$installerArgs); break; } // Local source file: if ($source) { if (!$version) { $version = $this->prompt("What version should we expect? "); } $installer->useLocalInstallFile($source, $version); } // Dangerous: if ($bypassSecurity) { $installer->bypassSecurityAndJustInstall(true); } // Now let's run the easy-install process: if ($installer->easyInstall()) { echo 'Success.', "\n"; exit(0); } else { echo 'Install unsuccessful. Check the logs for more information.', "\n"; exit(255); } |