<?php 
declare(strict_types=1); 
 
use Airship\Engine\{ 
    Gears, 
    State 
}; 
use GuzzleHttp\Client as HTTPClient; 
 
if (!\defined('ROOT')) { 
    require_once __DIR__.'/preload.php'; 
} 
/** 
 * This is the regular bootstrapping script for Airship. If you write your own 
 * API endpoint different from public/index.php, make sure you require_once 
 * this file. 
 * 
 * @global State $state 
 */ 
 
/** 
 * 1. Set up the cabins. 
 */ 
require_once ROOT . '/cabins.php'; 
\Airship\autoload('\\Airship\\Cabin', '~/Cabin'); 
 
/** 
 * 2. Let's bootstrap the routes and other configuration 
 *    for the current cabin (set in cabins.php) 
 */ 
if (!$state->active_cabin) { 
    \http_response_code(404); 
    echo \file_get_contents( 
        __DIR__ . '/error_pages/no-cabin.html' 
    ); 
    exit(1); 
} 
$active = $state->cabins[$state->active_cabin]; 
$state->lang = isset($active['lang'])  
    ? $active['lang'] 
    : 'en-us'; // default 
 
/** 
 * 3. Defer execution if we are updating this Cabin: 
 */ 
if (!\ISCLI) { 
    $cabinFile = \implode(DIRECTORY_SEPARATOR, [ 
        ROOT, 
        'tmp', 
        'cabin.' . $active['name'] . '.offline.txt' 
    ]); 
    if (\file_exists($cabinFile)) { 
        // There might be an automatic update in progress! 
        // Let's give it up to 15 seconds, but only as much time as is needed. 
        $iter = 0; 
        do { 
            if (!\file_exists($cabinFile)) { 
                break; 
            } 
            \usleep(1000); 
            ++$iter; 
        } while($iter < 15000); 
 
        \clearstatcache(); 
        // If we're still in the middle of that process, let's not load anything else: 
        if (\file_exists($cabinFile)) { 
            echo \__('This Airship is currently docked for routine maintenance. Please try again later.'), "\n"; 
            exit(255); 
        } 
    } 
} 
 
// Let's set the current language: 
$lang = \preg_replace_callback( 
    '#([A-Za-z]+)\-([a-zA-Z]+)#', 
        function($matches) { 
            return \strtolower($matches[1]).'_'.\strtoupper($matches[2]); 
        }, 
        $state->lang 
    ) . '.UTF-8'; 
\putenv('LANG='.$lang); 
 
// Overload the active template 
if (isset($active['data']['base_template'])) { 
    $state->base_template = $active['data']['base_template']; 
} else { 
    $state->base_template = 'base.twig'; 
} 
 
// Let's load the universal configuration settings 
$universal = \Airship\loadJSON(ROOT . '/config/universal.json'); 
$state->universal = $universal; 
 
// Let's start our session: 
require_once ROOT . '/session.php'; 
 
// This loads templates for the template engine 
$twigLoader = new \Twig_Loader_Filesystem( 
    ROOT . '/Cabin/' . $active['name'] . '/View' 
); 
 
$lensLoad = []; 
 
// Load all the gadgets, which can act on $twigLoader 
include ROOT . '/config/gadgets.php'; 
 
// Twig configuration options: 
$twigOpts = [ 
    // Defaults to 'html' strategy: 
    'autoescape' => true, 
    'debug' => $state->universal['debug'] 
]; 
if (!empty($state->universal['twig-cache'])) { 
    $twigOpts['cache'] = ROOT . '/tmp/cache/twig'; 
} 
 
$twigEnv = new \Twig_Environment($twigLoader, $twigOpts); 
if ($state->universal['debug']) { 
    $twigEnv->addExtension(new \Twig_Extension_Debug()); 
} 
$lens = Gears::get('View', $twigEnv); 
 
// Load the View configuration 
include ROOT . '/config/view.php'; 
 
// Load the Cabin-specific filters etc, if applicable: 
if (\file_exists(ROOT . '/Cabin/' . $active['name'] . '/view.php')) { 
    include ROOT . '/Cabin/' . $active['name'] . '/view.php'; 
} 
 
// Load the template variables for this Cabin: 
if (\file_exists(ROOT.'/config/Cabin/' . $active['name'] . '/twig_vars.json')) { 
    $_settings = \Airship\loadJSON( 
        ROOT.'/config/Cabin/' . $active['name'] . '/twig_vars.json' 
    ); 
    $lens->addGlobal( 
        'SETTINGS', 
        $_settings 
    ); 
} 
 
// Now let's load all the lens.php files, which are added by Gadgets: 
foreach ($lensLoad as $incl) { 
    include $incl; 
} 
 
/** 
 * Let's load up the databases 
 */ 
$dbPool = []; 
require ROOT . '/database.php'; 
 
// Airship manifest: 
$manifest = \Airship\loadJSON(ROOT . '/config/manifest.json'); 
$state->manifest = $manifest; 
 
$htmlpurifier = new \HTMLPurifier( 
    \HTMLPurifier_Config::createDefault() 
); 
$state->HTMLPurifier = $htmlpurifier; 
 
/** 
 * Load up all of the keys used by the application: 
 */ 
require_once ROOT . '/keys.php'; 
 
/** 
 * Set up the logger 
 */ 
require_once ROOT . '/config/logger.php'; 
 
/** 
 * Automatic security updates 
 */ 
$hail = Gears::get( 
    'Hail', 
    new HTTPClient($state->universal['guzzle']) 
); 
$state->hail = $hail; 
 
// PEAR support for Crypt_GPG 
if (!\class_exists('Crypt_GPG_Exception')) { 
    include_once 'Crypt/GPG/Exceptions.php'; 
    if (!\class_exists('Crypt_GPG_Exception')) { 
        die('Crypt_GPG not installed.'); 
    } 
} 
 
 |