Esempio n. 1
0
void genSMBIOSMemoryDevices(size_t index,
                            const SMBStructHeader* hdr,
                            uint8_t* address,
                            size_t size,
                            QueryData& results) {
  if (hdr->type != kSMBIOSTypeMemoryDevice || size < 0x12) {
    return;
  }

  Row r;
  r["handle"] = dmiWordToHexStr(address, 0x02);
  r["array_handle"] = dmiWordToHexStr(address, 0x04);

  auto formFactor = kSMBIOSMemoryFormFactorTable.find(address[0x0E]);
  if (formFactor != kSMBIOSMemoryFormFactorTable.end()) {
    r["form_factor"] = formFactor->second;
  }

  auto memBits = dmiToWord(address, 0x08);
  if (memBits != 0xFFFF) {
    r["total_width"] = INTEGER(memBits);
  }

  memBits = dmiToWord(address, 0x0A);
  if (memBits != 0xFFFF) {
    r["data_width"] = INTEGER(memBits);
  }

  memBits = dmiToWord(address, 0x0C);
  if (memBits != 0xFFFF) {
    r["size"] = (memBits != 0x7FFF) ? INTEGER(memBits)
                                    : INTEGER(dmiToDWord(address, 0x1C));
  }

  if (address[0x0F] != 0xFF) {
    r["set"] = INTEGER(static_cast<int>(address[0x0F]));
  }

  uint8_t* data = address + hdr->length;
  r["device_locator"] = dmiString(data, address, 0x10);
  r["bank_locator"] = dmiString(data, address, 0x11);

  auto memoryType = kSMBIOSMemoryTypeTable.find(address[0x12]);
  if (memoryType != kSMBIOSMemoryTypeTable.end()) {
    r["memory_type"] = memoryType->second;
  }

  r["memory_type_details"] =
      dmiBitFieldToStr(dmiToWord(address, 0x13), kSMBIOSMemoryDetailsTable);

  auto speed = dmiToWord(address, 0x15);
  if (speed != 0x0000 && speed != 0xFFFF) {
    r["max_speed"] = INTEGER(speed);
  }

  speed = dmiToWord(address, 0x20);
  if (speed != 0x0000 && speed != 0xFFFF) {
    r["configured_clock_speed"] = INTEGER(speed);
  }

  r["manufacturer"] = dmiString(data, address, 0x17);
  r["serial_number"] = dmiString(data, address, 0x18);
  r["asset_tag"] = dmiString(data, address, 0x19);
  r["part_number"] = dmiString(data, address, 0x1A);

  auto vt = dmiToWord(address, 0x22);
  if (vt != 0) {
    r["min_voltage"] = INTEGER(vt);
  }

  vt = dmiToWord(address, 0x24);
  if (vt != 0) {
    r["max_voltage"] = INTEGER(vt);
  }

  vt = dmiToWord(address, 0x26);
  if (vt != 0) {
    r["configured_voltage"] = INTEGER(vt);
  }

  results.push_back(std::move(r));
}
Esempio n. 2
0
QueryData genSystemInfo(QueryContext& context) {
  Row r;
  r["hostname"] = osquery::getHostname();
  r["computer_name"] = r["hostname"];

  std::string uuid;
  r["uuid"] = (osquery::getHostUUID(uuid)) ? uuid : "";

  auto qd = SQL::selectAllFrom("cpuid");
  for (const auto& row : qd) {
    if (row.at("feature") == "product_name") {
      r["cpu_brand"] = row.at("value");
      boost::trim(r["cpu_brand"]);
    }
  }

  // Can parse /proc/cpuinfo or /proc/meminfo for this data.
  static long cores = sysconf(_SC_NPROCESSORS_CONF);
  if (cores > 0) {
    r["cpu_logical_cores"] = INTEGER(cores);
    r["cpu_physical_cores"] = INTEGER(cores);
  } else {
    r["cpu_logical_cores"] = "-1";
    r["cpu_physical_cores"] = "-1";
  }

  static long pages = sysconf(_SC_PHYS_PAGES);
  static long pagesize = sysconf(_SC_PAGESIZE);

  if (pages > 0 && pagesize > 0) {
    r["physical_memory"] = BIGINT((long long)pages * (long long)pagesize);
  } else {
    r["physical_memory"] = "-1";
  }

  r["cpu_type"] = "0";
  r["cpu_subtype"] = "0";

  // Read the types from CPU info within proc.
  std::string content;
  if (readFile("/proc/cpuinfo", content)) {
    for (const auto& line : osquery::split(content, "\n")) {
      // Iterate each line and look for labels (there is also a model type).
      if (line.find("cpu family") == 0 || line.find("model\t") == 0) {
        auto details = osquery::split(line, ":");
        if (details.size() == 2) {
          // Not the most elegant but prevents us from splitting each line.
          r[(line[0] == 'c') ? "cpu_type" : "cpu_subtype"] = details[1];
        }
      }
    }
  }

  {
    LinuxSMBIOSParser parser;
    if (!parser.discover()) {
      r["hardware_model"] = "";
    } else {
      parser.tables(([&r](size_t index,
                          const SMBStructHeader* hdr,
                          uint8_t* address,
                          size_t size) {
        if (hdr->type != kSMBIOSTypeSystem || size < 0x12) {
          return;
        }

        uint8_t* data = address + hdr->length;
        r["hardware_vendor"] = dmiString(data, address, 0x04);
        r["hardware_model"] = dmiString(data, address, 0x05);
        r["hardware_version"] = dmiString(data, address, 0x06);
        r["hardware_serial"] = dmiString(data, address, 0x07);
      }));
    }
  }

  return {r};
}