2020-09-06 09:32:56 +02:00
|
|
|
<?php declare(strict_types=1);
|
2020-08-27 00:57:01 +02:00
|
|
|
|
|
|
|
namespace Orbit;
|
|
|
|
|
|
|
|
use Monolog\Logger;
|
|
|
|
use Monolog\Formatter\LineFormatter;
|
|
|
|
use Monolog\Handler\StreamHandler;
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Console
|
|
|
|
*
|
|
|
|
* @package Orbit
|
|
|
|
*/
|
2020-08-27 00:57:01 +02:00
|
|
|
class Console extends \Qi_Console_Client
|
|
|
|
{
|
2020-09-06 09:32:56 +02:00
|
|
|
public static $under_test = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute the console command
|
|
|
|
*
|
|
|
|
* @param Logger $logger
|
|
|
|
* @return int Status code
|
|
|
|
*/
|
|
|
|
public function execute(Logger $logger = null): int
|
2020-08-27 00:57:01 +02:00
|
|
|
{
|
2020-08-27 08:37:46 +02:00
|
|
|
if ($this->_args->get('no-color')) {
|
|
|
|
$this->_terminal->setIsatty(false);
|
|
|
|
}
|
|
|
|
|
2020-08-27 00:57:01 +02:00
|
|
|
if ($this->_args->version) {
|
|
|
|
$this->showVersion();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->_args->help) {
|
|
|
|
$this->showHelp();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-08-27 05:52:57 +02:00
|
|
|
$config = $this->makeConfig();
|
2020-09-06 09:32:56 +02:00
|
|
|
if (!$logger) {
|
|
|
|
$logger = $this->makeLogger($config, $this->_args->quiet);
|
|
|
|
}
|
2020-08-27 05:52:57 +02:00
|
|
|
|
2020-08-31 08:04:44 +02:00
|
|
|
if (!$this->_args->quiet) {
|
2020-08-27 05:52:57 +02:00
|
|
|
print "Orbit // Gemini server software\n";
|
|
|
|
}
|
2020-08-31 08:04:44 +02:00
|
|
|
|
|
|
|
$cert = new Cert($config, $logger);
|
|
|
|
|
|
|
|
$server = new Server($config, $cert, $logger);
|
2020-09-06 09:32:56 +02:00
|
|
|
|
|
|
|
if (!self::$under_test) {
|
|
|
|
$server->listen();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2020-08-27 05:52:57 +02:00
|
|
|
}
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Make Config object
|
|
|
|
*
|
|
|
|
* @return Config
|
|
|
|
*/
|
|
|
|
public function makeConfig(): Config
|
2020-08-27 05:52:57 +02:00
|
|
|
{
|
2020-08-31 08:04:44 +02:00
|
|
|
$config = new Config($this->_args->dev);
|
|
|
|
|
|
|
|
if ($this->_args->config) {
|
|
|
|
$config->readFromIniFile($this->_args->config);
|
|
|
|
}
|
2020-08-27 00:57:01 +02:00
|
|
|
|
2020-09-03 21:11:09 +02:00
|
|
|
if ($this->_args->host || $this->_args->host == "0") {
|
2020-08-27 00:57:01 +02:00
|
|
|
$config->host = $this->_args->host;
|
|
|
|
}
|
|
|
|
|
2020-09-03 21:11:09 +02:00
|
|
|
if ($this->_args->port || $this->_args->port == "0") {
|
2020-08-27 00:57:01 +02:00
|
|
|
$config->port = $this->_args->port;
|
|
|
|
}
|
|
|
|
|
2020-08-27 05:16:05 +02:00
|
|
|
if ($this->_args->hostname) {
|
|
|
|
$config->hostname = $this->_args->hostname;
|
|
|
|
}
|
|
|
|
|
2020-08-27 00:57:01 +02:00
|
|
|
if ($this->_args->log) {
|
|
|
|
$config->log_file = $this->_args->log;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->_args->verbose) {
|
2020-08-31 08:04:44 +02:00
|
|
|
$config->log_level = Logger::DEBUG;
|
2020-08-27 00:57:01 +02:00
|
|
|
}
|
|
|
|
|
2020-08-27 08:37:46 +02:00
|
|
|
if ($this->_args->get("root-dir")) {
|
|
|
|
$config->root_dir = $this->_args->get("root-dir");
|
|
|
|
}
|
|
|
|
|
2020-08-27 05:16:05 +02:00
|
|
|
if ($this->_args->get("tls-cert")) {
|
|
|
|
$config->tls_certfile = $this->_args->get("tls-cert");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->_args->get("tls-key")) {
|
|
|
|
$config->tls_keyfile = $this->_args->get("tls-key");
|
|
|
|
}
|
|
|
|
|
2020-09-28 16:35:13 +02:00
|
|
|
if ($this->_args->get("tls-passphrase")) {
|
|
|
|
$config->key_passphrase = $this->_args->get("tls-passphrase");
|
|
|
|
}
|
|
|
|
|
2020-08-27 05:52:57 +02:00
|
|
|
return $config;
|
2020-08-27 00:57:01 +02:00
|
|
|
}
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Make Logger object
|
|
|
|
*
|
|
|
|
* @param Config $config
|
|
|
|
* @param bool $is_quiet
|
|
|
|
* @return Logger
|
|
|
|
*/
|
|
|
|
public function makeLogger(Config $config, $is_quiet = false): Logger
|
2020-08-27 00:57:01 +02:00
|
|
|
{
|
|
|
|
$logger = new Logger('orbit');
|
|
|
|
|
|
|
|
$level = Logger::INFO;
|
2020-08-31 08:04:44 +02:00
|
|
|
if ($config->log_level) {
|
|
|
|
$level = $config->log_level;
|
2020-08-27 00:57:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
$log_stream = new StreamHandler($config->log_file, $level);
|
2020-08-27 05:52:57 +02:00
|
|
|
$log_stream->setFormatter($this->makeLogFormatter());
|
2020-08-27 00:57:01 +02:00
|
|
|
$logger->pushHandler($log_stream);
|
|
|
|
|
2020-08-31 08:04:44 +02:00
|
|
|
if (!$is_quiet) {
|
2020-08-27 00:57:01 +02:00
|
|
|
$std_stream = new StreamHandler('php://stdout', $level);
|
2020-08-27 05:52:57 +02:00
|
|
|
$std_stream->setFormatter($this->makeLogFormatter(true));
|
2020-08-27 00:57:01 +02:00
|
|
|
$logger->pushHandler($std_stream);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $logger;
|
|
|
|
}
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Make a LineFormatter object
|
|
|
|
*
|
|
|
|
* @return LineFormatter
|
|
|
|
*/
|
|
|
|
private function makeLogFormatter($is_tty = false): LineFormatter
|
2020-08-27 05:52:57 +02:00
|
|
|
{
|
|
|
|
$pid = getmypid();
|
|
|
|
|
|
|
|
if ($is_tty) {
|
|
|
|
$output = "{2}[%datetime%]{} {3}$pid %channel%.%level_name%:{} %message% %context%\n";
|
|
|
|
$output = str_replace("{2}", $this->_terminal->do_setaf(2), $output);
|
|
|
|
$output = str_replace("{3}", $this->_terminal->do_setaf(3), $output);
|
|
|
|
$output = str_replace("{}", $this->_terminal->do_op(), $output);
|
|
|
|
} else {
|
|
|
|
$output = "[%datetime%] $pid %channel%.%level_name%: %message% %context%\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
return new LineFormatter($output, 'Y-m-d\TH:i:s');
|
|
|
|
}
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Print the version of orbit server
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function showVersion(): void
|
2020-08-27 00:57:01 +02:00
|
|
|
{
|
|
|
|
print "Orbit " . Server::$version . "\n";
|
|
|
|
}
|
|
|
|
|
2020-09-06 09:32:56 +02:00
|
|
|
/**
|
|
|
|
* Print the help message
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function showHelp(): void
|
2020-08-27 00:57:01 +02:00
|
|
|
{
|
|
|
|
$this->showVersion();
|
|
|
|
|
|
|
|
$out = $this->_terminal->do_op()
|
|
|
|
. "Usage: orbit [options]\n"
|
|
|
|
. "\n"
|
|
|
|
. $this->_terminal->do_setaf(3)
|
|
|
|
. "Options:\n"
|
|
|
|
. $this->_terminal->do_op();
|
|
|
|
|
|
|
|
foreach ($this->_args->getHelp() as $key => $value) {
|
|
|
|
if (strpos($key, "|")) {
|
|
|
|
$parts = explode("|", $key);
|
|
|
|
$left = sprintf("-%s, --%s", $parts[0], $parts[1]);
|
|
|
|
} else {
|
|
|
|
$left = sprintf(" --%s", $key);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($left[-1] == ":") {
|
|
|
|
$left = substr($left, 0, -1) . " <arg>";
|
|
|
|
}
|
|
|
|
|
|
|
|
$out .= sprintf(
|
|
|
|
" %s%s %s%s\n",
|
|
|
|
$this->_terminal->do_setaf(2),
|
|
|
|
str_pad($left, 20),
|
|
|
|
$this->_terminal->do_op(),
|
2020-08-28 00:29:20 +02:00
|
|
|
$value
|
2020-08-27 00:57:01 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
print $out;
|
|
|
|
}
|
|
|
|
}
|