blob: d9eac104abd59411de8b91a6218573294ff3cfc9 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "debugd/src/ipaddrs_tool.h"
#include <base/strings/string_number_conversions.h>
#include <base/strings/string_util.h>
#include <base/strings/stringprintf.h>
#include <brillo/process/process.h>
#include "debugd/src/process_with_output.h"
namespace debugd {
namespace {
const char kIpTool[] = "/bin/ip";
bool RunOneIPCommand(std::vector<std::string>* result,
const std::vector<std::string>& argv) {
ProcessWithOutput p;
if (!p.Init()) {
result->push_back("[ ProcessWithOutput::Init() failed ]");
return false;
}
p.AddArg(kIpTool);
for (const auto& arg : argv) {
p.AddArg(arg);
}
if (p.Run()) {
result->push_back("[ ProcessWithOutput::Run() failed ]");
return false;
}
p.GetOutputLines(result);
// GetOutputLines() overwrites |result|, so the heading needs to be
// inserted afterward.
result->insert(
result->begin(),
base::StringPrintf("[ ip %s ]", base::JoinString(argv, " ").c_str()));
return true;
}
} // namespace
std::vector<std::string> IpAddrsTool::GetIpAddresses(
const brillo::VariantDictionary& options) {
std::vector<std::string> full_result, cmd_result;
std::string ip_version = "-4";
if (brillo::GetVariantValueOrDefault<bool>(options, "v6"))
ip_version = "-6";
RunOneIPCommand(&full_result, {ip_version, "addr", "show"});
return full_result;
}
} // namespace debugd