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
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/chromebox_for_meetings/artemis/specialized_log_sources.h"
#include "base/files/file_enumerator.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/ash/chromebox_for_meetings/artemis/log_source.h"
#include "third_party/re2/src/re2/re2.h"
namespace ash::cfm {
/*** audit.log ***/
constexpr LazyRE2 kAuditLogLineRegex = {
// Note the blank () group for severity. Audit logs don't have a
// severity, so match on a blank string and force to the default.
"type=[A-Z0-9_]+ msg=audit\\(([0-9.]+):[0-9]+\\): ()((?s).*)"};
AuditLogSource::AuditLogSource(base::TimeDelta poll_rate, size_t batch_size)
: LogSource(kCfmAuditLogFile, poll_rate, batch_size) {}
AuditLogSource::~AuditLogSource() = default;
RE2& AuditLogSource::GetLogLineRegex() {
return *kAuditLogLineRegex;
}
uint64_t AuditLogSource::TimestampStringToUnixTime(
const std::string& timestamp) {
// Audit files have the timestamp directly in time-since-epoch format
// (in seconds) so just convert to an int and return it. To convert to
// microseconds, parse the TS as a double (to capture the decimal point),
// then multiply by 1,000,000.
double ts_double;
if (!base::StringToDouble(timestamp, &ts_double)) {
return 0;
}
return ts_double * 1000000;
}
/*** bios_info.txt ***/
BiosInfoLogSource::BiosInfoLogSource(base::TimeDelta poll_rate,
size_t batch_size)
: LogSource(kCfmBiosInfoLogFile, poll_rate, batch_size) {}
BiosInfoLogSource::~BiosInfoLogSource() = default;
bool BiosInfoLogSource::AreTimestampsExpected() const {
return false;
}
/*** eventlog.txt ***/
constexpr LazyRE2 kEventlogLogLineRegex = {
// Note the blank () group for severity. The eventlog doesn't have a
// severity, so match on a blank string and force to the default.
"[0-9]+ \\| ((?s).+?) \\| ()((?s).*)"};
EventlogLogSource::EventlogLogSource(base::TimeDelta poll_rate,
size_t batch_size)
: LogSource(kCfmEventlogLogFile, poll_rate, batch_size) {}
EventlogLogSource::~EventlogLogSource() = default;
RE2& EventlogLogSource::GetLogLineRegex() {
return *kEventlogLogLineRegex;
}
/*** .varations-list.txt ***/
VariationsListLogSource::VariationsListLogSource(base::TimeDelta poll_rate,
size_t batch_size)
: LogSource(GetVariationsLogPath(kCfmVariationsListLogFile),
poll_rate,
batch_size) {}
VariationsListLogSource::~VariationsListLogSource() = default;
bool VariationsListLogSource::AreTimestampsExpected() const {
return false;
}
std::string VariationsListLogSource::GetVariationsLogPath(
const std::string& basename) {
// CfM devices will only contain a single robot user, so use
// a regex to find the only matching home directory.
std::string regex = "/home/chronos/u-[0-9a-f]+";
auto basepath = base::FilePath("/home/chronos");
base::FileEnumerator file_iter(basepath,
/*recursive=*/false,
base::FileEnumerator::DIRECTORIES);
for (base::FilePath file = file_iter.Next(); !file.empty();
file = file_iter.Next()) {
if (RE2::FullMatch(file.value(), regex)) {
return file.Append(basename).value();
}
}
// If the robot dir doesn't exist, fall back to variations list on rootfs.
return "/home/chronos/" + basename;
}
} // namespace ash::cfm
|