<?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.');
}
}
|