def bridge_port_pvid_del(self, bridgeportname, pvid): if self.ipbatch and not self.ipbatch_pause: self.add_to_batch('vlan del vid %s untagged pvid dev %s' % (pvid, bridgeportname)) else: utils.exec_command('bridge vlan del vid %s untagged pvid dev %s' % (pvid, bridgeportname))
def _bridge_fill(self, bridgename=None, refresh=False): try: # if cache is already filled, return linkCache.get_attr([bridgename, 'linkinfo', 'fd']) return except: pass if not bridgename: brctlout = utils.exec_command('/sbin/brctl show') else: brctlout = utils.exec_command('/sbin/brctl show %s' % bridgename) if not brctlout: return for bline in brctlout.splitlines()[1:]: bitems = bline.split() if len(bitems) < 2: continue try: linkCache.update_attrdict([bitems[0], 'linkinfo'], {'stp': bitems[2]}) except KeyError: linkCache.update_attrdict([bitems[0]], {'linkinfo': { 'stp': bitems[2] }}) self._bridge_attrs_fill(bitems[0])
def is_mstpd_running(self): try: utils.exec_command('/bin/pidof mstpd') except: return False else: return True
def link_set(self, ifacename, key, value=None, force=False, type=None, state=None): if not force: if (key not in ['master', 'nomaster'] and self._cache_check('link', [ifacename, key], value)): return cmd = 'link set dev %s' % ifacename if type: cmd += ' type %s' % type cmd += ' %s' % key if value: cmd += ' %s' % value if state: cmd += ' %s' % state if self.ipbatch: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd) if key not in ['master', 'nomaster']: self._cache_update([ifacename, key], value)
def addr_flush(self, ifacename): cmd = 'addr flush dev %s' % ifacename if self.ipbatch and not self.ipbatch_pause: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd) self._cache_delete([ifacename, 'addrs'])
def _up(self, ifaceobj): """ up vrrpd -n -D -i $IFACE -v 1 -p 20 10.0.1.254 up ifplugd -i $IFACE -b -f -u0 -d1 -I -p -q """ if (not ifupdownflags.flags.DRYRUN and not os.path.exists('/sys/class/net/%s' %ifaceobj.name)): return cmd = '' attrval = ifaceobj.get_attr_value_first('vrrp-id') if attrval: cmd += ' -v %s' %attrval else: return attrval = ifaceobj.get_attr_value_first('vrrp-priority') if attrval: cmd += ' -p %s' %attrval else: self.logger.warn('%s: incomplete vrrp parameters ' %ifaceobj.name, '(priority not found)') attrval = ifaceobj.get_attr_value_first('vrrp-virtual-ip') if attrval: cmd += ' %s' %attrval else: self.logger.warn('%s: incomplete vrrp arguments ' %ifaceobj.name, '(virtual ip not found)') return cmd = '/usr/sbin/vrrpd -n -D -i %s %s' %(ifaceobj.name, cmd) utils.exec_command(cmd) cmd = '/usr/sbin/ifplugd -i %s -b -f -u0 -d1 -I -p -q' %ifaceobj.name if self._check_if_process_is_running('/usr/sbin/ifplugd', cmd): self.logger.info('%s: ifplugd already running' %ifaceobj.name) return utils.exec_command(cmd)
def mstpbridge_exists(self, bridgename): try: utils.exec_command('mstpctl showbridge %s' % bridgename, stdout=False) return True except: return False
def _rule_cache_fill(self): ip_rules = utils.exec_command('/sbin/ip rule show').splitlines() self.ip_rule_cache = [' '.join(r.split()) for r in ip_rules] self.l3mdev4_rule = self._l3mdev_rule(self.ip_rule_cache) ip_rules = utils.exec_command('/sbin/ip -6 rule show').splitlines() self.ip6_rule_cache = [' '.join(r.split()) for r in ip_rules] self.l3mdev6_rule = self._l3mdev_rule(self.ip6_rule_cache)
def bridge_port_vids_get(self, bridgeportname): utils.exec_command('/sbin/bridge vlan show %s' % bridgeportname) bridgeout = utils.exec_command('/sbin/bridge vlan show dev %s' % bridgeportname) if not bridgeout: return [] brvlanlines = bridgeout.readlines()[2:] vids = [l.strip() for l in brvlanlines] return [v for v in vids if v]
def set_bridgeport_attr(self, bridgename, bridgeportname, attrname, attrval): if self._cache_check( [bridgename, 'linkinfo', 'ports', bridgeportname, attrname], attrval): return utils.exec_command('/sbin/brctl set%s %s %s %s' % (attrname, bridgename, bridgeportname, attrval))
def _down_vrf_helper(self, ifaceobj, vrf_table): mode = "" if ifupdownflags.flags.PERFMODE: mode = "boot" if self.vrf_helper: utils.exec_command( '%s delete %s %s %s' % (self.vrf_helper, ifaceobj.name, vrf_table, mode))
def delete_bridge_port(self, bridgename, bridgeportname): """ Delete port from bridge """ ports = self._cache_get([bridgename, 'linkinfo', 'ports']) if not ports or not ports.get(bridgeportname): return utils.exec_command('/sbin/brctl delif %s %s' % (bridgename, bridgeportname)) self._cache_delete([bridgename, 'linkinfo', 'ports', 'bridgeportname'])
def set_vxlandev_learning(self, ifacename, learn): if learn == 'on': utils.exec_command('ip link set dev %s type vxlan learning' % ifacename) self._cache_update([ifacename, 'linkinfo', 'learning'], 'on') else: utils.exec_command('ip link set dev %s type vxlan nolearning' % ifacename) self._cache_update([ifacename, 'linkinfo', 'learning'], 'off')
def link_delete(self, ifacename): if not self.link_exists(ifacename): return cmd = 'link del %s' % ifacename if self.ipbatch and not self.ipbatch_pause: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd) self._cache_invalidate()
def add_bridge_port(self, bridgename, bridgeportname): """ Add port to bridge """ ports = self._cache_get([bridgename, 'linkinfo', 'ports']) if ports and ports.get(bridgeportname): return utils.exec_command('/sbin/brctl addif %s %s' % (bridgename, bridgeportname)) self._cache_update([bridgename, 'linkinfo', 'ports', bridgeportname], {})
def _link_set_ifflag(self, ifacename, value): # Dont look at the cache, the cache may have stale value # because link status can be changed by external # entity (One such entity is ifupdown main program) cmd = 'link set dev %s %s' % (ifacename, value.lower()) if self.ipbatch: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd)
def is_process_running(self, processname): if not processname: return False try: utils.exec_command('/bin/pidof %s' % processname, stdout=False) except: return False else: return True
def link_create_macvlan(self, name, linkdev, mode='private'): if self.link_exists(name): return cmd = ('link add link %s' % linkdev + ' name %s' % name + ' type macvlan mode %s' % mode) if self.ipbatch and not self.ipbatch_pause: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd) self._cache_update([name], {})
def _close_sockets(self, ifaceobj, ifindex): if not self.vrf_close_socks_on_down: return try: utils.exec_command('/bin/ss -aK \"dev == %s\"' % ifindex) except Exception, e: self.logger.info('%s: closing socks using ss' ' failed (%s)\n' % (ifaceobj.name, str(e))) pass
def set_bridgeport_attrs(self, bridgename, bridgeportname, attrdict): portattrs = self._cache_get( [bridgename, 'linkinfo', 'ports', bridgeportname]) if portattrs == None: portattrs = {} for k, v in attrdict.iteritems(): if ifupdownflags.flags.CACHE: curval = portattrs.get(k) if curval and curval == v: continue utils.exec_command('/sbin/brctl set%s %s %s %s' % (k, bridgename, bridgeportname, v))
def link_set_hwaddress(self, ifacename, hwaddress, force=False): if not force: if self._cache_check('link', [ifacename, 'hwaddress'], hwaddress): return self.link_down(ifacename) cmd = 'link set dev %s address %s' % (ifacename, hwaddress) if self.ipbatch: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd) self.link_up(ifacename) self._cache_update([ifacename, 'hwaddress'], hwaddress)
def _down(self, ifaceobj): """ down ifplugd -k -i $IFACE down kill $(cat /var/run/vrrpd_$IFACE_*.pid) """ attrval = ifaceobj.get_attr_value_first('vrrp-id') if not attrval: return try: utils.exec_command('/usr/sbin/ifplugd -k -i %s' % ifaceobj.name) except Exception, e: self.logger.debug('%s: ifplugd down error (%s)' %(ifaceobj.name, str(e))) pass
def set_bridge_attrs(self, bridgename, attrdict): for k, v in attrdict.iteritems(): if not v: continue if self._cache_check([bridgename, 'linkinfo', k], v): continue try: cmd = '/sbin/brctl set%s %s %s' % (k, bridgename, v) utils.exec_command(cmd) except Exception, e: self.logger.warn('%s: %s' % (bridgename, str(e))) pass
def route_add_gateway(self, ifacename, gateway, vrf=None, metric=None): if not gateway: return if not vrf: cmd = 'ip route add default via %s' % gateway else: cmd = 'ip route add table %s default via %s' % (vrf, gateway) # Add metric if metric: cmd += 'metric %s' % metric cmd += ' dev %s' % ifacename utils.exec_command(cmd)
def route_del_gateway(self, ifacename, gateway, vrf=None, metric=None): # delete default gw if not gateway: return if not vrf: cmd = 'ip route del default via %s' % gateway else: cmd = 'ip route del table %s default via %s' % (vrf, gateway) if metric: cmd += ' metric %s' % metric cmd += ' dev %s' % ifacename utils.exec_command(cmd)
def _del_vrf_rules(self, vrf_dev_name, vrf_table): pref = 200 ip_rule_out_format = '%s: from all %s %s lookup %s' ip_rule_cmd = 'ip %s rule del pref %s %s %s table %s' rule = ip_rule_out_format % (pref, 'oif', vrf_dev_name, vrf_dev_name) if rule in self.ip_rule_cache: rule_cmd = ip_rule_cmd % ('', pref, 'oif', vrf_dev_name, vrf_dev_name) utils.exec_command(rule_cmd) rule = ip_rule_out_format % (pref, 'iif', vrf_dev_name, vrf_dev_name) if rule in self.ip_rule_cache: rule_cmd = ip_rule_cmd % ('', pref, 'iif', vrf_dev_name, vrf_dev_name) utils.exec_command(rule_cmd) rule = ip_rule_out_format % (pref, 'oif', vrf_dev_name, vrf_dev_name) if rule in self.ip6_rule_cache: rule_cmd = ip_rule_cmd % ('-6', pref, 'oif', vrf_dev_name, vrf_dev_name) utils.exec_command(rule_cmd) rule = ip_rule_out_format % (pref, 'iif', vrf_dev_name, vrf_dev_name) if rule in self.ip6_rule_cache: rule_cmd = ip_rule_cmd % ('-6', pref, 'iif', vrf_dev_name, vrf_dev_name) utils.exec_command(rule_cmd)
def bridge_batch_commit(self): if not self.ipbatchbuf: self.ipbatchbuf = '' self.ipbatch = False self.ipbatch_pause = False return try: utils.exec_command('bridge -force -batch -', stdin=self.ipbatchbuf) except: raise finally: self.ipbatchbuf = '' self.ipbatch = False self.ipbatch_pause = False
def tunnel_change(self, tunnelname, attrs={}): """ tunnel change function """ if not self.link_exists(tunnelname): return cmd = 'tunnel change' cmd += ' %s' % (tunnelname) if attrs: for k, v in attrs.iteritems(): cmd += ' %s' % k if v: cmd += ' %s' % v if self.ipbatch and not self.ipbatch_pause: self.add_to_batch(cmd) else: utils.exec_command('ip %s' % cmd)
def bridge_fdb_del(self, dev, address, vlan=None, bridge=True, remote=None): target = 'self' if bridge else '' vlan_str = '' if vlan: vlan_str = 'vlan %s ' % vlan dst_str = '' if remote: dst_str = 'dst %s ' % remote utils.exec_command('bridge fdb del %s dev %s %s %s %s' % (address, dev, vlan_str, target, dst_str))
def bridge_port_vids_del(self, bridgeportname, vids): if not vids: return [ utils.exec_command('bridge vlan del vid %s dev %s' % (v, bridgeportname)) for v in vids ]