AttestationResult AttestationClientImpl::GetOSInfo()

in client-library/src/Attestation/AttestationClient/lib/AttestationClientImpl.cpp [635:702]


AttestationResult AttestationClientImpl::GetOSInfo(OsInfo& os_info) {

    CLIENT_LOG_INFO("Retrieving OS Info");
    os_info = OsInfo();

    AttestationResult result(AttestationResult::ErrorCode::SUCCESS);

#ifdef PLATFORM_UNIX
    std::unordered_map<std::string, std::string> os_release_entries;
    if(!os::ParseOSReleaseFile(g_os_release_path, std::string("="), os_release_entries)) {
        CLIENT_LOG_ERROR("Failed to parse file path to retrieve OS info");
        result.code_ = AttestationResult::ErrorCode::ERROR_FAILED_TO_GET_OS_INFO;
        result.description_ = std::string("Failed to parse file path to retrieve OS info");

        return result;
    }

    auto entry = os_release_entries.find(std::string(g_distro_name_key));
    if(entry == os_release_entries.end()) {
        CLIENT_LOG_ERROR("Distro name not found");
        result.code_ = AttestationResult::ErrorCode::ERROR_FAILED_TO_GET_OS_INFO;
        result.description_ = std::string("Distro name not found");
        return result;
    }
    std::string distro_name = entry->second;

    entry = os_release_entries.find(std::string(g_distro_version_key));
    std::string version_str =  std::string("1.0");
    if(entry == os_release_entries.end()) {
        CLIENT_LOG_ERROR("Distro version not found, using default version");
    } else {
        version_str = entry->second;
    }

    uint32_t major_version = 0;
    uint32_t minor_version = 0;
    if(!os::ParseVersionString(version_str, major_version, minor_version)) {
        CLIENT_LOG_ERROR("Failed to process distro version, using default version");
        major_version = 1;
        minor_version = 0;
    }
    os_info.type = OsType::LINUX;
    os_info.distro_name = distro_name;
    os_info.distro_version_major = major_version;
    os_info.distro_version_minor = minor_version;
    os_info.build = std::string(g_os_build_str);
#else
    os_info.type = OsType::WINDOWS;

    // For windows, distro name will be an a static string "Microsoft".
    os_info.distro_name = std::string(g_distro_name_str);

    std::string build;
    uint32_t major_version = 0;
    uint32_t minor_version = 0;
    if(!os::GetWindowsVersion(major_version, minor_version, build)) {
        CLIENT_LOG_ERROR("Failed to get windows version");
        result.code_ = AttestationResult::ErrorCode::ERROR_FAILED_TO_GET_OS_INFO;
        result.description_ = std::string("Failed to get windows version");
        return result;
    }

    os_info.distro_version_major = major_version;
    os_info.distro_version_minor = minor_version;
    os_info.build = build;
#endif
    return result;
}