// Runs "iptables --version" to get the version string func getIptablesVersionString(exec utilexec.Interface) (string, error) { bytes, err := exec.Command("iptables", "--version").CombinedOutput() if err != nil { return "", err } return string(bytes), nil }
// 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 findPairInterfaceOfContainerInterface(e exec.Interface, containerPid int, containerInterfaceName string) (string, error) { nsenterPath, err := e.LookPath("nsenter") if err != nil { return "", err } ethtoolPath, err := e.LookPath("ethtool") if err != nil { return "", err } // Get container's interface index output, err := e.Command(nsenterPath, "-t", fmt.Sprintf("%d", containerPid), "-n", "-F", "--", ethtoolPath, "--statistics", containerInterfaceName).CombinedOutput() if err != nil { return "", fmt.Errorf("Unable to query interface %s of container %d: %v", containerInterfaceName, containerPid, err) } // look for peer_ifindex match := ethtoolOutputRegex.FindSubmatch(output) if match == nil { return "", fmt.Errorf("No peer_ifindex in interface statistics for %s of container %d", containerInterfaceName, containerPid) } peerIfIndex, err := strconv.Atoi(string(match[1])) if err != nil { // seems impossible (\d+ not numeric) return "", fmt.Errorf("peer_ifindex wasn't numeric: %s: %v", match[1], err) } iface, err := net.InterfaceByIndex(peerIfIndex) if err != nil { return "", err } return iface.Name, nil }
// NewProxier returns a new Proxier given an iptables Interface instance. // Because of the iptables logic, it is assumed that there is only a single Proxier active on a machine. // An error will be returned if iptables fails to update or acquire the initial lock. // Once a proxier is created, it will keep iptables up to date in the background and // will not terminate if a particular iptables call fails. func NewProxier(ipt utiliptables.Interface, exec utilexec.Interface, syncPeriod time.Duration, masqueradeAll bool) (*Proxier, error) { // Set the route_localnet sysctl we need for if err := utilsysctl.SetSysctl(sysctlRouteLocalnet, 1); err != nil { return nil, fmt.Errorf("can't set sysctl %s: %v", sysctlRouteLocalnet, err) } // Load the module. It's OK if this fails (e.g. the module is not present) // because we'll catch the error on the sysctl, which is what we actually // care about. exec.Command("modprobe", "br-netfilter").CombinedOutput() if err := utilsysctl.SetSysctl(sysctlBridgeCallIptables, 1); err != nil { glog.Warningf("can't set sysctl %s: %v", sysctlBridgeCallIptables, err) } return &Proxier{ serviceMap: make(map[proxy.ServicePortName]*serviceInfo), endpointsMap: make(map[proxy.ServicePortName][]string), portsMap: make(map[localPort]closeable), syncPeriod: syncPeriod, iptables: ipt, masqueradeAll: masqueradeAll, }, nil }