public function buildLogger(Container $container) { $logger = new Logger($container['names_resolver']); /** @var Config $config */ $config = $container['config']; $loggingConfig = $config->getSection('logging'); $shouldResolve = Ar::get($loggingConfig, 'resolve') ?: false; $logger->setResolveNames($shouldResolve); $loggingEntries = Ar::get($loggingConfig, 'handlers') ?: []; Ar::each($loggingEntries, function ($loggingEntry) use($logger, $container) { $filter = Ar::get($loggingEntry, 'filter') ?: 255; $handlerName = Ar::get($loggingEntry, 'handler'); switch ($handlerName) { case 'slack': $channels = Ar::get($loggingEntry, 'channels') ?: []; $handler = (new SlackHandler($container['slack_facade']))->setChannels($channels)->setFilter($filter); break; case 'console': $handler = (new ConsoleOutputHandler())->setFilter($filter); break; default: return; } $logger->addHandler($handler); }); $container['logger'] = $logger; }
/** * Processes !-command * @param RequestDto $dto */ public function processCommand(RequestDto $dto) { $words = preg_split('/\\s+/is', $dto->getText()); $command = Ar::get($words, 0); if (null === $command || '!' !== substr($command, 0, 1)) { return; } $command = substr($command, 1); Logger::get()->info("id: %s, %s is executing command \"%s\" at %s", $dto->getId(), $dto->getUser(), $dto->getText(), $dto->getChannel()); /** @var BaseCommandHandler $commandHandler */ foreach ($this->commandHandlers as $commandHandler) { $commandName = $commandHandler->getName(); if (is_array($commandName)) { if (!in_array($command, $commandName)) { continue; } } else { if ($commandName !== $command) { continue; } } $allowed = $this->checkAccess($dto, $commandHandler); if (!$allowed) { $this->slackFacade->multiSendMessage([$dto->getChannel()], sprintf('SYSTEM: access to command !%s denied', $commandHandler->getName())); Logger::get()->warning("id: %s, access denied for %s trying to run \"%s\" at %s", $dto->getId(), $dto->getUser(), $dto->getText(), $dto->getChannel()); return; } unset($words[0]); if ($commandHandler->canProcessCommand($words, $dto->getChannel())) { /** @var SlackFacade $slackFacade */ $slackFacade = Registry::get('container')['slack_facade']; $commandHandler->setCallerId($dto->getUser()); $commandHandler->setCallerName($slackFacade->getUserNameById($dto->getUser())); Logger::get()->debug("id: %s, starting %s command handler", $dto->getId(), $commandHandler->getName()); $commandHandler->processCommand($words, $dto->getChannel()); Logger::get()->debug("id: %s, finished %s command handler", $dto->getId(), $commandHandler->getName()); } } }
/** * Fires request to Slack server and returns response * @param string $method Slack API method to call * @param array $data request data * @return array * @throws \Exception */ private function processRequest($method, $data = []) { $methodsToFilter = ['api.test', 'rtm.start', 'chat.postMessage']; $method = $this->getApiMethodName($method); $url = self::BASE_URL . $method; $data['token'] = $this->token; if (true !== Ar::get($data, 'in_logger')) { Logger::get()->raw("➡️ %s", $url, json_encode($data)); } /** @var ApiCache $cache */ $cache = Registry::get('container')['api_cache']; $cachedResponse = $cache->get($url, $data); if (null !== $cachedResponse && !in_array($method, $methodsToFilter)) { if (true !== Ar::get($data, 'in_logger')) { Logger::get()->raw("⬅️ %s: cache hit", $url); } return $cachedResponse; } $result = $this->curlRequest->getCurlResult($url, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $data])['body']; if (true !== Ar::get($data, 'in_logger')) { Logger::get()->raw("⬅️ %s", $url, $result); } if (!in_array($method, $methodsToFilter)) { $cache->set($url, $data, json_decode($result, true)); } return json_decode($result, true); }
public function processCommand(array $args, $channel) { Logger::get()->warning('Server restarted by %s', $this->getCallerName()); Posix::execute(['sudo service supervisord restart']); }