Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132#!/usr/bin/env php<?php
if (function_exists('pcntl_async_signals')) { pcntl_async_signals(true);} else { declare(ticks = 1);}
require_once dirname(__FILE__).'/../../__init_script__.php';
if (!posix_isatty(STDOUT)) { $sid = posix_setsid(); if ($sid <= 0) { throw new Exception(pht('Failed to create new process session!')); }}
$args = new PhutilArgumentParser($argv);$args->setTagline(pht('daemon executor'));$args->setSynopsis(<<<EOHELP**exec_daemon.php** [__options__] __daemon__ ... Run an instance of __daemon__.EOHELP );$args->parse( array( array( 'name' => 'trace', 'help' => pht('Enable debug tracing.'), ), array( 'name' => 'trace-memory', 'help' => pht('Enable debug memory tracing.'), ), array( 'name' => 'verbose', 'help' => pht('Enable verbose activity logging.'), ), array( 'name' => 'label', 'short' => 'l', 'param' => 'label', 'help' => pht( 'Optional process label. Makes "%s" nicer, no behavioral effects.', 'ps'), ), array( 'name' => 'daemon', 'wildcard' => true, ), ));
$trace_memory = $args->getArg('trace-memory');$trace_mode = $args->getArg('trace') || $trace_memory;$verbose = $args->getArg('verbose');
if (function_exists('posix_isatty') && posix_isatty(STDIN)) { fprintf(STDERR, pht('Reading daemon configuration from stdin...')."\n");}$config = @file_get_contents('php://stdin');$config = id(new PhutilJSONParser())->parse($config);
PhutilTypeSpec::checkMap( $config, array( 'log' => 'optional string|null', 'argv' => 'optional list<wild>', 'load' => 'optional list<string>', 'down' => 'optional int', ));
$log = idx($config, 'log');
if ($log) { ini_set('error_log', $log); PhutilErrorHandler::setErrorListener(array('PhutilDaemon', 'errorListener'));}
$load = idx($config, 'load', array());foreach ($load as $library) { $library = Filesystem::resolvePath($library); phutil_load_library($library);}
PhutilErrorHandler::initialize();
$daemon = $args->getArg('daemon');if (!$daemon) { throw new PhutilArgumentUsageException( pht('Specify which class of daemon to start.'));} else if (count($daemon) > 1) { throw new PhutilArgumentUsageException( pht('Specify exactly one daemon to start.'));} else { $daemon = head($daemon); if (!class_exists($daemon)) { throw new PhutilArgumentUsageException( pht( 'No class "%s" exists in any known library.', $daemon)); } else if (!is_subclass_of($daemon, 'PhutilDaemon')) { throw new PhutilArgumentUsageException( pht( 'Class "%s" is not a subclass of "%s".', $daemon, 'PhutilDaemon')); }}
$argv = idx($config, 'argv', array());$daemon = newv($daemon, array($argv));
if ($trace_mode) { $daemon->setTraceMode();}
if ($trace_memory) { $daemon->setTraceMemory();}
if ($verbose) { $daemon->setVerbose(true);}
$down_duration = idx($config, 'down');if ($down_duration) { $daemon->setScaledownDuration($down_duration);}
$daemon->execute();