def startip_cmd(self): if which("ifconfig") and self.alias: if ':' in self.addr: cmd = [ 'ifconfig', self.ipdev, 'inet6', 'add', '/'.join([self.addr, to_cidr(self.mask)]) ] else: cmd = [ 'ifconfig', self.stacked_dev, self.addr, 'netmask', to_dotted(self.mask), 'up' ] else: cmd = [ rcEnv.syspaths.ip, "addr", "add", '/'.join([self.addr, to_cidr(self.mask)]), "dev", self.ipdev ] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # ip activation may still be incomplete # wait for activation, to avoid startapp scripts to fail binding their listeners for i in range(5, 0, -1): if check_ping(self.addr, timeout=1, count=1): return ret, out, err self.log.error("timed out waiting for ip activation") raise ex.excError
def is_up(self): cmd = [rcEnv.syspaths.ipadm, "show-addr", "-p", "-o", "STATE,ADDR", self.ipdev+'/'+self.ipdevExt] out, err, ret = justcall(cmd) if ret != 0: # normal down state return False try: state, addr = out.strip("\n").split(":") except ValueError: self.status_log(out) return False if state != "ok": self.status_log("state: %s" % state) return False try: _addr, _mask = addr.split("/") except ValueError: self.status_log(out) return False if _addr != self.addr: self.status_log("wrong addr: %s" % addr) return False if self.mask is None: self.status_log("netmask not specified nor guessable") elif _mask != to_cidr(self.mask): self.status_log("wrong mask: %s, expected %s" % (_mask, to_cidr(self.mask))) return True return True
def _is_up(self, ifconfig): intf = ifconfig.has_param("ipaddr", self.addr) if intf is not None: if isinstance(intf.ipaddr, list): idx = intf.ipaddr.index(self.addr) current_mask = to_cidr(intf.mask[idx]) else: current_mask = to_cidr(intf.mask) if self.mask is None: self.status_log("netmask is not set nor guessable") elif current_mask != to_cidr(self.mask): self.status_log("current mask %s, expected %s" % (current_mask, to_cidr(self.mask))) ref_dev = intf.name.split(":")[0] if self.type == "ip" and ref_dev != self.ipdev: self.status_log("current dev %s, expected %s" % (ref_dev, self.ipdev)) return True intf = ifconfig.has_param("ip6addr", self.addr) if intf is not None: if isinstance(intf.ip6addr, list): idx = intf.ip6addr.index(self.addr) current_mask = to_cidr(intf.ip6mask[idx]) else: current_mask = to_cidr(intf.ip6mask) if current_mask != to_cidr(self.mask): self.status_log("current mask %s, expected %s" % (current_mask, to_cidr(self.mask))) ref_dev = intf.name.split(":")[0] if self.type == "ip" and ref_dev != self.ipdev: self.status_log("current dev %s, expected %s" % (ref_dev, self.ipdev)) return True return False
def set_label(self): """ Set the resource label property. """ try: self.get_mask() except ex.excError: pass self.label = "netns %s %s/%s %s@%s" % (self.mode, self.ipname, to_cidr(self.mask), self.ipdev, self.container_rid)
def startip_cmd(self): if ':' in self.addr: cmd = ['ifconfig', self.ipdev, 'inet6', 'up'] (ret, out, err) = self.vcall(cmd) if ret != 0: raise ex.excError cmd = ['ifconfig', self.stacked_dev, 'inet6', self.addr+'/'+to_cidr(self.mask), 'up'] else: cmd = ['ifconfig', self.stacked_dev, self.addr, 'netmask', to_dotted(self.mask), 'up'] return self.vcall(cmd)
def startip_cmd(self): if ':' in self.addr: cmd = [ 'ifconfig', self.ipdev, 'inet6', '/'.join([self.addr, to_cidr(self.mask)]), 'add' ] else: cmd = [ 'ifconfig', self.ipdev, 'inet', self.addr, 'netmask', '0xffffffff', 'add' ] return self.vcall(cmd)
def startip_cmd(self): if ':' in self.addr: cmd = [ 'ifconfig', self.ipdev, 'inet6', 'alias', '/'.join([self.addr, to_cidr(self.mask)]) ] else: cmd = [ 'ifconfig', self.ipdev, self.addr, 'netmask', to_dotted(self.mask), 'alias' ] return self.vcall(cmd)
def stopip_cmd(self): if which("ifconfig") and self.alias: if ':' in self.addr: cmd = [ 'ifconfig', self.ipdev, 'inet6', 'del', '/'.join([self.addr, to_cidr(self.mask)]) ] else: if self.stacked_dev is None: return 1, "", "no stacked dev found" if ":" in self.stacked_dev: cmd = ['ifconfig', self.stacked_dev, 'down'] else: cmd = [ rcEnv.syspaths.ip, "addr", "del", '/'.join([self.addr, to_cidr(self.mask)]), "dev", self.ipdev ] else: cmd = [ rcEnv.syspaths.ip, "addr", "del", '/'.join([self.addr, to_cidr(self.mask)]), "dev", self.ipdev ] return self.vcall(cmd)
def set_label(self): """ Set the resource label property. """ try: self.get_mask() except ex.excError: pass try: self.getaddr() addr = self.addr except ex.excError: addr = self.ipname self.label = "%s/%s %s/%s" % (addr, to_cidr(self.mask), self.ipdev, self.ipdevExt) if self.ipname != addr: self.label += " " + self.ipname
def _info(self): """ Contribute resource key/val pairs to the service's resinfo. """ if self.ipname is None: return [] try: self.getaddr() except ex.excError: pass data = [ ["ipaddr", self.addr], ["ipname", self.ipname], ["ipdev", self.ipdev], ["gateway", str(self.gateway)], ] if self.mask is not None: data.append(["mask", str(to_cidr(self.mask))]) return data
def _status_info(self): """ Contribute resource key/val pairs to the resource info. """ data = {} try: self.getaddr() except ex.excError: pass try: data["ipaddr"] = self.addr except: pass if self.ipdev: data["ipdev"] = self.ipdev if self.gateway: data["gateway"] = self.gateway if self.mask is not None: data["mask"] = to_cidr(self.mask) if self.expose: data["expose"] = self.expose return data
def startip_cmd(self): if not which(rcEnv.syspaths.ipadm): raise ex.excError("crossbow ips are not supported on this system") if self.mask is None: raise ex.excError("netmask not specified nor guessable") self.wait_net_smf() ret, out, err = (0, '', '') cmd = [rcEnv.syspaths.ipadm, 'show-if', '-p', '-o', 'state', self.stacked_dev] _out, err, ret = justcall(cmd) _out = _out.strip().split("\n") if len(_out) == 0: cmd=[rcEnv.syspaths.ipadm, 'create-ip', '-t', self.stacked_dev ] r, o, e = self.vcall(cmd) cmd=[rcEnv.syspaths.ipadm, 'create-addr', '-t', '-T', 'static', '-a', self.addr+"/"+to_cidr(self.mask), self.stacked_dev+'/'+self.ipdevExt] r, o, e = self.vcall(cmd) if r != 0: cmd=[rcEnv.syspaths.ipadm, 'show-if' ] self.vcall(cmd) raise ex.excError("Interface %s is not up. ipadm cannot create-addr over it. Retrying..." % self.stacked_dev) ret += r out += o err += e if self.gateway is not None: cmd=['route', '-q', 'add', 'default', self.gateway] r, o, e = self.call(cmd, info=True, outlog=False, errlog=False) ret += r return ret, out, err
def startip_cmd_shared_ovs(self): nspid = self.get_nspid() tmp_guest_dev = "v%spg%s" % (self.guest_dev, nspid) tmp_local_dev = "v%spl%s" % (self.guest_dev, nspid) mtu = self.ip_get_mtu() if not which("ovs-vsctl"): raise Exception("ovs-vsctl must be installed") # create peer devs cmd = [rcEnv.syspaths.ip, "link", "add", "name", tmp_local_dev, "mtu", mtu, "type", "veth", "peer", "name", tmp_guest_dev, "mtu", mtu] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err cmd = ["ovs-vsctl", "--may-exist", "add-port", self.ipdev, tmp_local_dev, "vlan_mode=%s" % self.vlan_mode] if self.vlan_tag is not None: cmd += ["tag=%s" % self.vlan_tag] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "up"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # assign the interface to the container namespace cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # rename the tmp guest dev cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # plumb ip cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", self.addr+"/"+to_cidr(self.mask), "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # setup default route self.ip_setup_route() return 0, "", ""
def startip_cmd_shared_bridge(self): nspid = self.get_nspid() tmp_guest_dev = "v%spg%s" % (self.guest_dev, nspid) tmp_local_dev = "v%spl%s" % (self.guest_dev, nspid) mtu = self.ip_get_mtu() # create peer devs cmd = [rcEnv.syspaths.ip, "link", "add", "name", tmp_local_dev, "mtu", mtu, "type", "veth", "peer", "name", tmp_guest_dev, "mtu", mtu] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # activate the parent dev cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "master", self.ipdev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "up"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # assign the macvlan interface to the container namespace cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # rename the tmp guest dev cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # set the mac addr self.set_macaddr() # plumb ip cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", self.addr+"/"+to_cidr(self.mask), "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # setup default route self.ip_setup_route() return 0, "", ""
def startip_cmd_shared_macvlan(self): nspid = self.get_nspid() tmp_guest_dev = "ph%s%s" % (nspid, self.guest_dev) mtu = self.ip_get_mtu() # create a macvlan interface cmd = [rcEnv.syspaths.ip, "link", "add", "link", self.ipdev, "dev", tmp_guest_dev, "mtu", mtu, "type", "macvlan", "mode", "bridge"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # activate the parent dev cmd = [rcEnv.syspaths.ip, "link", "set", self.ipdev, "up"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # assign the macvlan interface to the container namespace cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # rename the tmp guest dev cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # set the mac addr self.set_macaddr() # plumb the ip cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", "%s/%s" % (self.addr, to_cidr(self.mask)), "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # setup default route self.ip_setup_route() return 0, "", ""
def startip_cmd_dedicated(self): # assign interface to the nspid nspid = self.get_nspid() if nspid is None: raise ex.excError("could not determine nspid") cmd = [rcEnv.syspaths.ip, "link", "set", self.ipdev, "netns", nspid, "name", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # plumb the ip cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", "%s/%s" % (self.addr, to_cidr(self.mask)), "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # activate cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", self.final_guest_dev, "up"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # add default route if self.gateway: cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "add", "default", "via", self.gateway, "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # announce cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns] + rcEnv.python_cmd + [os.path.join(rcEnv.paths.pathlib, "arp.py"), self.final_guest_dev, self.addr] self.log.info(" ".join(cmd)) out, err, ret = justcall(cmd) return 0, "", ""
def ip_setup_route(self): cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", self.final_guest_dev, "up"] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "list", "default"] ret, out, err = self.call(cmd, errlog=False) if out.startswith("default via"): pass elif out.startswith("default dev") and not self.gateway: pass elif self.gateway: cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "replace", "default", "via", self.gateway] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err else: cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "replace", "default", "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err if self.del_net_route and self.network: cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "del", self.network+"/"+to_cidr(self.mask), "dev", self.final_guest_dev] ret, out, err = self.vcall(cmd) if ret != 0: return ret, out, err # announce cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns] + rcEnv.python_cmd + [os.path.join(rcEnv.paths.pathlib, "arp.py"), self.final_guest_dev, self.addr] self.log.info(" ".join(cmd)) out, err, ret = justcall(cmd)
def stopip_cmd(self): intf = self.get_docker_interface() if intf is None: raise ex.excContinueAction("can't find on which interface %s is plumbed in container %s" % (self.addr, self.container_id())) if self.mask is None: raise ex.excContinueAction("netmask is not set") cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "del", self.addr+"/"+to_cidr(self.mask), "dev", intf] ret, out, err = self.vcall(cmd) cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "del", "dev", intf] ret, out, err = self.vcall(cmd) if self.mode == "ovs": self.log.info("ovs mode") ret, out, err = self.stopip_cmd_shared_ovs() self.unset_lazy("netns") return ret, out, err