summaryrefslogtreecommitdiffstats
path: root/library/Director/Daemon/DaemonProcessDetails.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/Director/Daemon/DaemonProcessDetails.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/library/Director/Daemon/DaemonProcessDetails.php b/library/Director/Daemon/DaemonProcessDetails.php
new file mode 100644
index 0000000..454e31f
--- /dev/null
+++ b/library/Director/Daemon/DaemonProcessDetails.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Icinga\Module\Director\Daemon;
+
+use gipfl\LinuxHealth\Memory;
+use Icinga\Application\Platform;
+use React\ChildProcess\Process;
+use gipfl\Cli\Process as CliProcess;
+
+class DaemonProcessDetails
+{
+ /** @var string */
+ protected $instanceUuid;
+
+ /** @var \stdClass */
+ protected $info;
+
+ /** @var ProcessList[] */
+ protected $processLists = [];
+
+ protected $myArgs;
+
+ protected $myPid;
+
+ public function __construct($instanceUuid)
+ {
+ $this->instanceUuid = $instanceUuid;
+ $this->initialize();
+ }
+
+ public function getInstanceUuid()
+ {
+ return $this->instanceUuid;
+ }
+
+ public function getPropertiesToInsert()
+ {
+ return $this->getPropertiesToUpdate() + (array) $this->info;
+ }
+
+ public function getPropertiesToUpdate()
+ {
+ return [
+ 'ts_last_update' => DaemonUtil::timestampWithMilliseconds(),
+ 'ts_stopped' => null,
+ 'process_info' => \json_encode($this->collectProcessInfo()),
+ ];
+ }
+
+ public function set($property, $value)
+ {
+ if (\property_exists($this->info, $property)) {
+ $this->info->$property = $value;
+ } else {
+ throw new \InvalidArgumentException("Trying to set invalid daemon info property: $property");
+ }
+ }
+
+ public function registerProcessList(ProcessList $list)
+ {
+ $refresh = function (Process $process) {
+ $this->refreshProcessInfo();
+ };
+ $list->on('start', $refresh)->on('exit', $refresh);
+ $this->processLists[] = $list;
+
+ return $this;
+ }
+
+ protected function refreshProcessInfo()
+ {
+ $this->set('process_info', \json_encode($this->collectProcessInfo()));
+ }
+
+ protected function collectProcessInfo()
+ {
+ $info = (object) [$this->myPid => (object) [
+ 'command' => implode(' ', $this->myArgs),
+ 'running' => true,
+ 'memory' => Memory::getUsageForPid($this->myPid)
+ ]];
+
+ foreach ($this->processLists as $processList) {
+ foreach ($processList->getOverview() as $pid => $details) {
+ $info->$pid = $details;
+ }
+ }
+
+ return $info;
+ }
+
+ protected function initialize()
+ {
+ global $argv;
+ CliProcess::getInitialCwd();
+ $this->myArgs = $argv;
+ $this->myPid = \posix_getpid();
+ if (isset($_SERVER['_'])) {
+ $self = $_SERVER['_'];
+ } else {
+ // Process does a better job, but want the relative path (if such)
+ $self = $_SERVER['PHP_SELF'];
+ }
+ $this->info = (object) [
+ 'instance_uuid_hex' => $this->instanceUuid,
+ 'running_with_systemd' => 'n',
+ 'ts_started' => (int) ((float) $_SERVER['REQUEST_TIME_FLOAT'] * 1000),
+ 'ts_stopped' => null,
+ 'pid' => \posix_getpid(),
+ 'fqdn' => Platform::getFqdn(),
+ 'username' => Platform::getPhpUser(),
+ 'schema_version' => null,
+ 'php_version' => Platform::getPhpVersion(),
+ 'binary_path' => $self,
+ 'binary_realpath' => CliProcess::getBinaryPath(),
+ 'php_integer_size' => PHP_INT_SIZE,
+ 'php_binary_path' => PHP_BINARY,
+ 'php_binary_realpath' => \realpath(PHP_BINARY), // TODO: useless?
+ 'process_info' => null,
+ ];
+ }
+}