void genInterfaceDetail(const IP_ADAPTER_ADDRESSES* adapter, Row& r) { r["interface"] = INTEGER(adapter->IfIndex); r["mtu"] = INTEGER(adapter->Mtu); r["type"] = INTEGER(adapter->IfType); r["description"] = wstringToString(adapter->Description); std::vector<std::string> toks; for (size_t i = 0; i < adapter->PhysicalAddressLength; i++) { std::stringstream ss; ss << std::hex; ss << static_cast<unsigned int>(adapter->PhysicalAddress[i]); auto s = ss.str(); if (s.size() < 2_sz) { s = '0' + s; } toks.push_back(s); } r["mac"] = osquery::join(toks, ":"); r["flags"] = INTEGER(adapter->Flags); r["metric"] = INTEGER(adapter->Ipv4Metric); // TODO: These values will need an equivalent on Windows systems r["last_change"] = BIGINT("-1"); r["collisions"] = BIGINT("-1"); // Grab the remaining table values from WMI auto query = "SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface WHERE " "Name = \"" + r["description"] + "\""; WmiRequest req1(query); if (req1.getStatus().ok()) { auto& results = req1.results(); if (!results.empty()) { std::string sPlaceHolder; unsigned long long ullPlaceHolder = 0; results[0].GetString("PacketsReceivedPerSec", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["ipackets"] = BIGINT(ullPlaceHolder); results[0].GetString("PacketsSentPerSec", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["opackets"] = BIGINT(ullPlaceHolder); results[0].GetString("BytesReceivedPerSec", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["ibytes"] = BIGINT(ullPlaceHolder); results[0].GetString("BytesSentPerSec", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["obytes"] = BIGINT(ullPlaceHolder); results[0].GetString("PacketsReceivedErrors", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["ierrors"] = BIGINT(ullPlaceHolder); results[0].GetString("PacketsOutboundErrors", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["oerrors"] = BIGINT(ullPlaceHolder); results[0].GetString("PacketsReceivedDiscarded", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["idrops"] = BIGINT(ullPlaceHolder); results[0].GetString("PacketsOutboundDiscarded", sPlaceHolder); safeStrtoull(sPlaceHolder, 10, ullPlaceHolder); r["odrops"] = BIGINT(ullPlaceHolder); } else { LOG(INFO) << "Failed to retrieve network statistics for interface " << r["interface"]; } } query = "SELECT * FROM Win32_NetworkAdapter WHERE " "InterfaceIndex = " + r["interface"]; WmiRequest req2(query); if (req2.getStatus().ok()) { auto& results = req2.results(); if (!results.empty()) { bool bPlaceHolder; long lPlaceHolder = 0; unsigned __int64 ullPlaceHolder = 0; results[0].GetString("Manufacturer", r["manufacturer"]); results[0].GetString("NetConnectionID", r["connection_id"]); results[0].GetLong("NetConnectionStatus", lPlaceHolder); r["connection_status"] = INTEGER(lPlaceHolder); results[0].GetBool("NetEnabled", bPlaceHolder); r["enabled"] = INTEGER(bPlaceHolder); results[0].GetBool("PhysicalAdapter", bPlaceHolder); r["physical_adapter"] = INTEGER(bPlaceHolder); results[0].GetString("ServiceName", r["service"]); results[0].GetUnsignedLongLong("Speed", ullPlaceHolder); r["speed"] = INTEGER(ullPlaceHolder); } else { LOG(INFO) << "Failed to retrieve physical state for interface " << r["interface"]; } } query = "SELECT * FROM win32_networkadapterconfiguration WHERE " "InterfaceIndex = " + r["interface"]; WmiRequest req3(query); if (req3.getStatus().ok()) { auto& results = req3.results(); if (!results.empty()) { bool bPlaceHolder; std::vector<std::string> vPlaceHolder; results[0].GetBool("DHCPEnabled", bPlaceHolder); r["dhcp_enabled"] = INTEGER(bPlaceHolder); results[0].GetString("DHCPLeaseExpires", r["dhcp_lease_expires"]); results[0].GetString("DHCPLeaseObtained", r["dhcp_lease_obtained"]); results[0].GetString("DHCPServer", r["dhcp_server"]); results[0].GetString("DNSDomain", r["dns_domain"]); results[0].GetVectorOfStrings("DNSDomainSuffixSearchOrder", vPlaceHolder); r["dns_domain_suffix_search_order"] = osquery::join(vPlaceHolder, ", "); results[0].GetString("DNSHostName", r["dns_host_name"]); results[0].GetVectorOfStrings("DNSServerSearchOrder", vPlaceHolder); r["dns_server_search_order"] = osquery::join(vPlaceHolder, ", "); } else { LOG(INFO) << "Failed to retrieve DHCP and DNS information for interface " << r["interface"]; } } }
END_TEST START_TEST(test_constructors) { req r; std::vector<std::string> l; fail_unless(r.getHostlist(l) == PBSE_EMPTY); fail_unless(l.size() == 0); fail_unless(r.getTaskCount() == 1); fail_unless(r.getPlacementType() == ""); fail_unless(r.getNodeAccessPolicy().size() == 0, r.getNodeAccessPolicy().c_str()); fail_unless(r.getOS().size() == 0); fail_unless(r.getGres().size() == 0); fail_unless(r.getDisk() == 0); fail_unless(r.getSwap() == 0); fail_unless(r.getMemory() == 0); fail_unless(r.getExecutionSlots() == 1, "slots: %d", r.getExecutionSlots()); std::string req2("5:lprocs=4:memory=12gb:place=socket=2:usecores:pack:gpus=2:mics=1:gres=matlab=1:feature=fast"); req r2(req2); fail_unless(r2.getTaskCount() == 5, "task count is %d", r2.getTaskCount()); fail_unless(r2.getPlacementType() == "socket=2", "value %s", r2.getPlacementType().c_str()); fail_unless(r2.getNodeAccessPolicy().size() == 0); fail_unless(r2.getOS().size() == 0); fail_unless(r2.getGres() == "matlab=1"); fail_unless(r2.getDisk() == 0); fail_unless(r2.getSwap() == 0); fail_unless(r2.getMemory() == 12 * 1024 * 1024); fail_unless(r2.getExecutionSlots() == 4); fail_unless(r2.getFeatures() == "fast", "features '%s'", r2.getFeatures().c_str()); req copy_r2(r2); fail_unless(copy_r2.getTaskCount() == 5); fail_unless(copy_r2.getPlacementType() == r2.getPlacementType(), "copy value '%s' first value '%s'", copy_r2.getPlacementType().c_str(), r2.getPlacementType().c_str()); fail_unless(copy_r2.getNodeAccessPolicy().size() == 0); fail_unless(copy_r2.getOS().size() == 0); fail_unless(copy_r2.getGres() == "matlab=1"); fail_unless(copy_r2.getDisk() == 0); fail_unless(copy_r2.getSwap() == 0); fail_unless(copy_r2.getMemory() == 12 * 1024 * 1024); fail_unless(copy_r2.getExecutionSlots() == 4); fail_unless(copy_r2.getFeatures() == "fast", "features '%s'", copy_r2.getFeatures().c_str()); std::string req3("5:lprocs=4:memory=12gb:place=node:mics=1:feature=fast"); req r3(req3); fail_unless(r3.getPlacementType() == "node"); std::string req4("5:lprocs=4:memory=12gb:place=numanode=1:mics=1:feature=fast"); req r4(req4); fail_unless(r4.getPlacementType() == "numanode=1", r4.getPlacementType().c_str()); std::string req5("5:lprocs=4:memory=12gb:place=core:mics=1:feature=fast"); req r5(req5); fail_unless(r5.getThreadUsageString() == "usecores", "thread usage '%s'", r5.getThreadUsageString().c_str()); std::string req6("5:lprocs=4:place=thread"); req r6(req6); fail_unless(r6.getThreadUsageString() == "usethreads", "thread usage '%s'", r6.getThreadUsageString().c_str()); // make sure miss-spellings are caught std::string error; req str_set; fail_unless(str_set.set_from_submission_string(strdup("5:lproc=2"), error) != PBSE_NONE); good_err = true; fail_unless(str_set.set_from_submission_string(strdup("5:lprocs=2:place=sockets=2"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("4:lprocs=all"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("4:memory=12gb:memory=1024mb"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("-1:lprocs=4"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("1:lprocs=-4"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("1:lprocs=4:memory=0"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("3:gpus=2:reseterr:exclusive_thread:opsys=cent6"), error) == PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("1:lprocs=all:place=core"), error) != PBSE_NONE); fail_unless(str_set.set_from_submission_string(strdup("1:lprocs=all:place=thread=2"), error) != PBSE_NONE); std::string req7("2:place=numanode"); req r7(req7); r7.set_index(0); std::vector<std::string> names; std::vector<std::string> values; r7.get_values(names, values); fail_unless(names[0] == "task_count.0", names[0].c_str()); fail_unless(names[1] == "lprocs.0", names[1].c_str()); fail_unless(names[2] == "numanode.0", names[2].c_str()); fail_unless(values[0] == "2"); fail_unless(values[1] == "1"); fail_unless(values[2] == "1"); std::string req8("2:place=core"); req r8(req8); r8.set_index(0); names.clear(); values.clear(); r8.get_values(names, values); fail_unless(names[0] == "task_count.0", names[0].c_str()); fail_unless(names[1] == "lprocs.0", names[1].c_str()); fail_unless(values[0] == "2"); fail_unless(values[1] == "1"); }