123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- namespace Aws\CloudTrail;
- use Aws\S3\S3Client;
- /**
- * The `Aws\CloudTrail\LogRecordIterator` provides an easy way to iterate over
- * log records from log files generated by AWS CloudTrail.
- *
- * CloudTrail log files contain data about your AWS API calls and are stored in
- * Amazon S3 at a predictable path based on a bucket name, a key prefix, an
- * account ID, a region, and date information. The files are gzipped and
- * contain structured data in JSON format. This class allows you to specify
- * options via its factory methods, including a date range, and emits each log
- * record from any log files that match the provided options.
- *
- * A log record containing data about an AWS API call is yielded for each
- * iteration on this object.
- */
- class LogRecordIterator implements \OuterIterator
- {
- /** @var LogFileReader */
- private $logFileReader;
- /** @var \Iterator */
- private $logFileIterator;
- /** @var array */
- private $records;
- /** @var int */
- private $recordIndex;
- /**
- * @param S3Client $s3Client
- * @param CloudTrailClient $cloudTrailClient
- * @param array $options
- *
- * @return LogRecordIterator
- */
- public static function forTrail(
- S3Client $s3Client,
- CloudTrailClient $cloudTrailClient,
- array $options = []
- ) {
- $logFileIterator = LogFileIterator::forTrail(
- $s3Client,
- $cloudTrailClient,
- $options
- );
- return new self(new LogFileReader($s3Client), $logFileIterator);
- }
- /**
- * @param S3Client $s3Client
- * @param string $s3BucketName
- * @param array $options
- *
- * @return LogRecordIterator
- */
- public static function forBucket(
- S3Client $s3Client,
- $s3BucketName,
- array $options = []
- ) {
- $logFileReader = new LogFileReader($s3Client);
- $iter = new LogFileIterator($s3Client, $s3BucketName, $options);
- return new self($logFileReader, $iter);
- }
- /**
- * @param S3Client $s3Client
- * @param string $s3BucketName
- * @param string $s3ObjectKey
- *
- * @return LogRecordIterator
- */
- public static function forFile(
- S3Client $s3Client,
- $s3BucketName,
- $s3ObjectKey
- ) {
- $logFileReader = new LogFileReader($s3Client);
- $logFileIterator = new \ArrayIterator([[
- 'Bucket' => $s3BucketName,
- 'Key' => $s3ObjectKey,
- ]]);
- return new self($logFileReader, $logFileIterator);
- }
- /**
- * @param LogFileReader $logFileReader
- * @param \Iterator $logFileIterator
- */
- public function __construct(
- LogFileReader $logFileReader,
- \Iterator $logFileIterator
- ) {
- $this->logFileReader = $logFileReader;
- $this->logFileIterator = $logFileIterator;
- $this->records = array();
- $this->recordIndex = 0;
- }
- /**
- * Returns the current log record as an array.
- *
- * @return array|false
- */
- #[\ReturnTypeWillChange]
- public function current()
- {
- return $this->valid() ? $this->records[$this->recordIndex] : false;
- }
- #[\ReturnTypeWillChange]
- public function next()
- {
- $this->recordIndex++;
- // If all the records have been exhausted, get more records from the
- // next log file.
- while (!$this->valid()) {
- $this->logFileIterator->next();
- $success = $this->loadRecordsFromCurrentLogFile();
- if (!$success) {
- // The objects iterator is exhausted as well, so stop trying
- break;
- }
- }
- }
- #[\ReturnTypeWillChange]
- public function key()
- {
- if ($logFile = $this->logFileIterator->current()) {
- return $logFile['Key'] . '.' . $this->recordIndex;
- }
- return null;
- }
- #[\ReturnTypeWillChange]
- public function valid()
- {
- return isset($this->records[$this->recordIndex]);
- }
- #[\ReturnTypeWillChange]
- public function rewind()
- {
- $this->logFileIterator->rewind();
- $this->loadRecordsFromCurrentLogFile();
- }
- #[\ReturnTypeWillChange]
- public function getInnerIterator()
- {
- return $this->logFileIterator;
- }
- /**
- * Examines the current file in the `logFileIterator` and attempts to read
- * it and load log records from it using the `logFileReader`. This method
- * expects that items pulled from the iterator will take the form:
- *
- * [
- * 'Bucket' => '...',
- * 'Key' => '...',
- * ]
- *
- * @return bool Returns `true` if records were loaded and `false` if no
- * records were found
- */
- private function loadRecordsFromCurrentLogFile()
- {
- $this->recordIndex = 0;
- $this->records = array();
- $logFile = $this->logFileIterator->current();
- if ($logFile && isset($logFile['Bucket']) && isset($logFile['Key'])) {
- $this->records = $this->logFileReader->read(
- $logFile['Bucket'],
- $logFile['Key']
- );
- }
- return (bool) $logFile;
- }
- }
|