<?php
declare(strict_types=1);
use Airship\Hangar\Command;
use Airship\Hangar\Commands\Help;
use ParagonIE\Halite\Halite;
use ParagonIE\ConstantTime\Binary;
/**
* This script is the entry point for all Hangar commands.
*/
define('HANGAR_ROOT', __DIR__);
$homeDir = isset($_SERVER['HOME'])
? $_SERVER['HOME']
: \posix_getpwuid(posix_getuid())['dir'];
define('AIRSHIP_USER_HOME', $homeDir);
define('AIRSHIP_LOCAL_CONFIG', AIRSHIP_USER_HOME . DIRECTORY_SEPARATOR . '.airship');
if (!\is_dir(AIRSHIP_LOCAL_CONFIG)) {
\mkdir(AIRSHIP_LOCAL_CONFIG, 0700);
}
/**
* 1. Register an autoloader for all the classes we use
*/
require __DIR__ . "/autoload.php";
require \dirname(__DIR__) . "/vendor/autoload.php";
/**
* 2. Load the configuration
*/
if (\is_readable(AIRSHIP_LOCAL_CONFIG."/hangar.json")) {
// Allow people to edit the JSON config and define their own locations
$config = \json_decode(
\file_get_contents(AIRSHIP_LOCAL_CONFIG."/hangar.json"),
true
);
} else {
// Sane defaults
$config = [
'skyports' => [
'https://airship.paragonie.com/atc/'
],
'vendors' => []
];
}
if (!\extension_loaded('libsodium')) {
// We need this
die(
"Please install libsodium and the libsodium-php extension from PECL\n\n".
"\thttps://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium\n"
);
}
/**
* Let the user know precisely what's wrong, if anything is wrong.
*/
if (!Halite::isLibsodiumSetupCorrectly()) {
// Easiest way to grab this info:
\ob_start(); \phpinfo(); $data = \ob_get_clean();
$version = '';
foreach (\explode("\n", $data) as $line) {
if (empty($line)) {
continue;
}
if (\strpos($line, 'libsodium compiled version') !== false) {
$version = \trim(Binary::safeSubstr(\trim($line), -6));
break;
}
}
die(
"Your libsodium is not setup correctly. Please make sure you have at least:\n\n" .
"\tlibsodium v1.0.13 (Installed: " . \SODIUM_LIBRARY_VERSION .")\n" .
"\tlibsodium-php v2.0.4 (Installed: " . $version . ")\n"
);
}
/**
* 3. Process the CLI parameters
*/
$showAll = true;
if ($argc < 2) {
// Default behavior: Display the help menu
$argv[1] = 'help';
$showAll = false;
$argc = 2;
}
// Create a little cache for the Help command, if applicable. Doesn't contain objects.
$commands = [];
foreach (\glob(__DIR__.'/Commands/*.php') as $file) {
// Let's build a queue of all the file names
// Grab the filename from the Commands directory:
$className = \preg_replace('#.*/([A-Za-z0-9_]+)\.php$#', '$1', $file);
$index = \strtolower($className);
// Append to $commands array
$commands[$index] = $className;
if ($argv[1] !== 'help') {
// If this is the command the user passed...
if ($index === $argv[1]) {
// Instantiate this object
$exec = Command::getCommandStatic($className);
// Store the relevant storage devices in the command, in case they're needed
$exec->storeConfig($config);
// Execute it, passing the extra parameters to the command's fire() method
try {
$exec->fire(
\array_values(
\array_slice($argv, 2)
)
);
} catch (\Exception $e) {
echo $e->getMessage(), "\n";
$code = $e->getCode();
exit($code > 0 ? $code : 255);
}
$exec->saveConfig();
exit(0);
}
}
}
/**
* 4. If all else fails, fall back to the help class...
*/
$help = new Help($commands);
$help->showAll = $showAll;
$help->storeConfig($config);
$help->fire(
\array_values(
\array_slice($argv, 2)
)
);
$help->saveConfig();
exit(0);
|