<?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);
 
 |