// getIptablesVersionString runs "iptables --version" to get the version string // in the form "X.X.X" func getIptablesVersionString(exec utilexec.Interface) (string, error) { // this doesn't access mutable state so we don't need to use the interface / runner bytes, err := exec.Command(cmdIptables, "--version").CombinedOutput() if err != nil { return "", err } versionMatcher := regexp.MustCompile("v([0-9]+\\.[0-9]+\\.[0-9]+)") match := versionMatcher.FindStringSubmatch(string(bytes)) if match == nil { return "", fmt.Errorf("no iptables version found in string: %s", bytes) } return match[1], nil }
func getOnePodIP(execer utilexec.Interface, nsenterPath, netnsPath, interfaceName, addrType string) (net.IP, error) { // Try to retrieve ip inside container network namespace output, err := execer.Command(nsenterPath, fmt.Sprintf("--net=%s", netnsPath), "-F", "--", "ip", "-o", addrType, "addr", "show", "dev", interfaceName, "scope", "global").CombinedOutput() if err != nil { return nil, fmt.Errorf("Unexpected command output %s with error: %v", output, err) } lines := strings.Split(string(output), "\n") if len(lines) < 1 { return nil, fmt.Errorf("Unexpected command output %s", output) } fields := strings.Fields(lines[0]) if len(fields) < 4 { return nil, fmt.Errorf("Unexpected address output %s ", lines[0]) } ip, _, err := net.ParseCIDR(fields[3]) if err != nil { return nil, fmt.Errorf("CNI failed to parse ip from output %s due to %v", output, err) } return ip, nil }