File: exec_daemon.php

package info (click to toggle)
phabricator 0~git20160726-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 67,360 kB
  • ctags: 116,654
  • sloc: php: 489,176; sql: 14,913; ansic: 3,619; yacc: 2,484; sh: 727; lex: 488; makefile: 229; cpp: 221; python: 186; sed: 66; xml: 23
file content (127 lines) | stat: -rwxr-xr-x 3,029 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/env php
<?php

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>',
    'autoscale' => 'optional wild',
  ));

$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);
}

$autoscale = idx($config, 'autoscale');
if ($autoscale) {
  $daemon->setAutoscaleProperties($autoscale);
}

$daemon->execute();