]> git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/ifupdownaddons/mstpctlutil.py
Merge 'vlan filtering bridge + vxlan + mlag + vrr' support from internal
[mirror_ifupdown2.git] / ifupdown2 / ifupdownaddons / mstpctlutil.py
1 #!/usr/bin/python
2 #
3 # Copyright 2014 Cumulus Networks, Inc. All rights reserved.
4 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
5 #
6
7 from utilsbase import *
8 from ifupdown.iface import *
9 from cache import *
10 import re
11
12 class mstpctlutil(utilsBase):
13 """ This class contains helper methods to interact with mstpd using
14 mstputils commands """
15
16 _cache_fill_done = False
17
18 _bridgeattrmap = {'bridgeid' : 'bridge-id',
19 'maxage' : 'max-age',
20 'fdelay' : 'forward-delay',
21 'txholdcount' : 'tx-hold-count',
22 'maxhops' : 'max-hops',
23 'ageing' : 'ageing-time',
24 'hello' : 'hello-time',
25 'forcevers' : 'force-protocol-version'}
26
27 _bridgeportattrmap = {'portadminedge' : 'admin-edge-port',
28 'portp2p' : 'admin-point-to-point',
29 'portrestrrole' : 'restricted-role',
30 'portrestrtcn' : 'restricted-TCN',
31 'bpduguard' : 'bpdu-guard-port',
32 'portautoedge' : 'auto-edge-port',
33 'portnetwork' : 'network-port',
34 'portbpdufilter' : 'bpdufilter-port'}
35
36 def __init__(self, *args, **kargs):
37 utilsBase.__init__(self, *args, **kargs)
38
39 def is_mstpd_running(self):
40 try:
41 self.exec_command('/bin/pidof mstpd')
42 except:
43 return False
44 else:
45 return True
46
47 def get_bridgeport_attr(self, bridgename, portname, attrname):
48 try:
49 return self.subprocess_check_output(['/sbin/mstpctl',
50 'showportdetail', '%s' %bridgename, '%s' %portname,
51 self._bridgeportattrmap[attrname]]).strip('\n')
52 except Exception, e:
53 pass
54 return None
55
56 def get_bridgeport_attrs(self, bridgename, portname):
57 bridgeattrs = {}
58 try:
59 bridgeattrs = dict((k, self.get_bridgeport_attr(bridgename, v))
60 for k, v in self._bridgeattrmap.items())
61 bridgeattrs['treeprio'] = int(bridgeattrs.get('bridgeid',
62 '').split('.')[0], base=16) * 4096
63 except Exception, e:
64 self.logger.warn(str(e))
65 pass
66 return bridgeattrs
67
68 def set_bridgeport_attrs(self, bridgename, bridgeportname, attrdict,
69 check=True):
70 for k, v in attrdict.iteritems():
71 if not v:
72 continue
73 try:
74 self.set_bridgeport_attr(self, bridgename, bridgeportname,
75 k, v, check)
76 except Exception, e:
77 self.logger.warn(str(e))
78
79 def set_bridgeport_attr(self, bridgename, bridgeportname, attrname,
80 attrvalue, check=True):
81 if check:
82 attrvalue_curr = self.get_bridgeport_attr(bridgename,
83 bridgeportname, attrname)
84 if attrvalue_curr and attrvalue_curr == attrvalue:
85 return
86 if attrname == 'treeportcost' or attrname == 'treeportprio':
87 self.subprocess_check_output(['/sbin/mstpctl', 'set%s' %attrname,
88 '%s' %bridgename, '%s' %bridgeportname, '0', '%s' %attrvalue])
89 else:
90 self.subprocess_check_output(['/sbin/mstpctl', 'set%s' %attrname,
91 '%s' %bridgename, '%s' %bridgeportname, '%s' %attrvalue])
92
93 def get_bridge_attrs(self, bridgename):
94 bridgeattrs = {}
95 try:
96 bridgeattrs = dict((k, self.get_bridge_attr(bridgename, k))
97 for k in self._bridgeattrmap.keys())
98 bridgeattrs['treeprio'] = '%d' %(int(bridgeattrs.get('bridgeid',
99 '').split('.')[0], base=16) * 4096)
100 del bridgeattrs['bridgeid']
101 except Exception, e:
102 self.logger.debug(bridgeattrs)
103 self.logger.debug(str(e))
104 pass
105 return bridgeattrs
106
107 def get_bridge_attr(self, bridgename, attrname):
108 try:
109 return self.subprocess_check_output(['/sbin/mstpctl',
110 'showbridge', '%s' %bridgename,
111 self._bridgeattrmap[attrname]]).strip('\n')
112 except Exception, e:
113 pass
114 return None
115
116 def set_bridge_attr(self, bridgename, attrname, attrvalue, check=True):
117
118 if check:
119 attrvalue_curr = self.get_bridge_attr(bridgename, attrname)
120 if attrvalue_curr and attrvalue_curr == attrvalue:
121 return
122 if attrname == 'treeprio':
123 self.subprocess_check_call(['/sbin/mstpctl', 'set%s' %attrname,
124 '%s' %bridgename, '0', '%s' %attrvalue])
125 else:
126 self.subprocess_check_call(['/sbin/mstpctl', 'set%s' %attrname,
127 '%s' %bridgename, '%s' %attrvalue])
128
129 def set_bridge_attrs(self, bridgename, attrdict, check=True):
130 for k, v in attrdict.iteritems():
131 if not v:
132 continue
133 try:
134 self.set_bridge_attr(bridgename, k, v, check)
135 except Exception, e:
136 self.logger.warn('%s: %s' %(bridgename, str(e)))
137 pass
138
139 def get_bridge_treeprio(self, bridgename):
140 try:
141 bridgeid = subprocess.check_output(['/sbin/mstpctl',
142 'showbridge', '%s' %bridgename,
143 self._bridgeattrmap['bridgeid']]).strip('\n')
144 return '%d' %(int(bridgeid.split('.')[0], base=16) * 4096)
145 except:
146 pass
147 return None
148
149 def set_bridge_treeprio(self, bridgename, attrvalue, check=True):
150 if check:
151 attrvalue_curr = self.get_bridge_treeprio(bridgename)
152 if attrvalue_curr and attrvalue_curr == attrvalue:
153 return
154 self.subprocess_check_output(['/sbin/mstpctl', 'settreeprio',
155 '%s' %bridgename, '0', '%s' %attrvalue])
156
157 def showbridge(self, bridgename=None):
158 if bridgename:
159 return self.exec_command('/sbin/mstpctl showbridge %s' %bridgename)
160 else:
161 return self.exec_command('/sbin/mstpctl showbridge')
162
163 def showportdetail(self, bridgename):
164 return self.exec_command('/sbin/mstpctl showportdetail %s' %bridgename)
165
166 def mstpbridge_exists(self, bridgename):
167 try:
168 subprocess.check_call('mstpctl showbridge %s' %bridgename)
169 return True
170 except:
171 return False