interface.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import atexit
  2. import pyroute2
  3. #-------------------------------
  4. def InitializeLibrary(library):
  5. if library == 'NDB':
  6. global ndb
  7. ndb = pyroute2.NDB()
  8. @atexit.register
  9. def close_ndb():
  10. ndb.close()
  11. elif library == 'IPR':
  12. global iproute
  13. iproute = pyroute2.IPRoute()
  14. @atexit.register
  15. def close_iproute():
  16. iproute.close()
  17. #-------------------------------
  18. def GetInterfaces(library):
  19. interfaces = []
  20. if library == 'NDB':
  21. for itf in ndb.interfaces:
  22. interfaces.append(Interface(ndb.interfaces[itf.ifname]))
  23. elif library == 'IPR':
  24. for itf in iproute.get_links():
  25. interfaces.append(Interface(itf))
  26. else:
  27. raise NetDhcpError(f'No Interface Library selected')
  28. return interfaces
  29. def GetInterface(library, ifname):
  30. if library == 'NDB':
  31. return Interface(ndb.interfaces[ifname])
  32. elif library == 'IPR':
  33. return Interface(iproute.get_links(ifname=ifname)[0])
  34. else:
  35. raise NetDhcpError(f'No Interface Library selected')
  36. return None
  37. class Interface:
  38. def __init__(self, interface):
  39. self.ndb = None
  40. self.ipr = None
  41. self._set_interface_(interface)
  42. self._initialize_attributes_()
  43. def __getitem__(self, key):
  44. return getattr(self, key, None)
  45. def _set_interface_(self, interface):
  46. if isinstance(interface, pyroute2.netlink.rtnl.ifinfmsg.ifinfmsg):
  47. self.ipr = interface
  48. elif isinstance(interface, pyroute2.ndb.objects.interface.Interface):
  49. self.ndb = interface
  50. else:
  51. raise NetDhcpError(f'Unknown Interface type')
  52. def _initialize_attributes_(self):
  53. if self.ndb:
  54. self.index = self.ndb['index']
  55. self.ifname = self.ndb['ifname']
  56. self.kind = self.ndb['kind']
  57. self.address = self.ndb['address']
  58. if 'netns' in self.ndb:
  59. self.netns = self.ndb['netns']
  60. else:
  61. self.netns = None
  62. self.ipaddr = []
  63. for address in self.ndb.ipaddr:
  64. ipaddress = {}
  65. ipaddress['address'] = address['address']
  66. ipaddress['prefixlen'] = address['prefixlen']
  67. self.ipaddr.append(ipaddress)
  68. self.routes = []
  69. for r in self.ndb.routes:
  70. route = {}
  71. route['type'] = r['type']
  72. route['family'] = r['family']
  73. route['dst'] = r['dst']
  74. route['gateway'] = r['gateway']
  75. route['dst_len'] = r['dst_len']
  76. self.routes.append(route)
  77. elif self.ipr:
  78. self.index = self.ipr['index']
  79. self.ifname = self.ipr.get_attr('IFLA_IFNAME')
  80. self.kind = self.ipr.get_attr('IFLA_LINKINFO').get_attr('IFLA_INFO_KIND') if self.ipr.get_attr('IFLA_LINKINFO') else None
  81. self.address = self.ipr.get_attr('IFLA_ADDRESS')
  82. self.netns = None
  83. self.ipaddr = []
  84. for address in iproute.get_addr(label=self.ipr.get_attr('IFLA_IFNAME')):
  85. ipaddress = {}
  86. ipaddress['address'] = address.get_attr('IFA_ADDRESS')
  87. ipaddress['prefixlen'] = address['prefixlen']
  88. self.ipaddr.append(ipaddress)
  89. self.routes = []
  90. for r in iproute.get_routes():
  91. attrs = dict(r['attrs'])
  92. if 'RTA_OIF' in attrs and attrs['RTA_OIF'] == self['index']:
  93. if 'RTA_PRIORITY' in attrs and not attrs['RTA_PRIORITY'] < 255:
  94. continue
  95. route = {}
  96. route['type'] = r['type']
  97. route['family'] = r['family']
  98. route['dst'] = attrs['RTA_DST'] if 'RTA_DST' in attrs else ''
  99. route['gateway'] = attrs['RTA_GATEWAY'] if 'RTA_GATEWAY' in attrs else None
  100. route['dst_len'] = r['dst_len']
  101. self.routes.append(route)
  102. else:
  103. raise NetDhcpError(f'No Interface Library selected')
  104. def SetAddress(self, address):
  105. self.address = address
  106. if self.ndb:
  107. self.ndb.set('address', self.address).commit()
  108. elif self.ipr:
  109. iproute.link('set', index=self.index, address=self.address)
  110. else:
  111. raise NetDhcpError(f'No Interface Library selected')
  112. def Up(self):
  113. if self.ndb:
  114. self.ndb.set('state', 'up').commit()
  115. elif self.ipr:
  116. iproute.link("set", index=self.index, state="up")
  117. else:
  118. raise NetDhcpError(f'No Interface Library selected')
  119. def Down(self):
  120. if self.ndb:
  121. self.ndb.set('state', 'down').commit()
  122. elif self.ipr:
  123. iproute.link("set", index=self.index, state="down")
  124. else:
  125. raise NetDhcpError(f'No Interface Library selected')
  126. def CreateInterface(library, ifname, kind, peer):
  127. try:
  128. if library == 'NDB':
  129. ndb.interfaces.create(ifname=ifname, kind=kind, peer=peer).commit()
  130. return Interface(ndb.interfaces[ifname])
  131. elif library == 'IPR':
  132. iproute.link("add", ifname=ifname, kind=kind, peer=peer)
  133. return Interface(iproute.get_links(ifname=ifname)[0])
  134. else:
  135. raise NetDhcpError(f'No Interface Library selected')
  136. return None
  137. except Exception as e:
  138. return None
  139. def RemoveInterface(library, ifname):
  140. try:
  141. if library == 'NDB':
  142. ndb.interfaces[ifname].remove().commit()
  143. elif library == 'IPR':
  144. iproute.link("del", index=iproute.link_lookup(ifname=ifname)[0])
  145. else:
  146. raise NetDhcpError(f'No Interface Library selected')
  147. except Exception as e:
  148. return
  149. def AddPort(library, bridge, ifname):
  150. try:
  151. if library == 'NDB':
  152. ndb.interfaces[bridge].add_port(ifname).commit()
  153. elif library == 'IPR':
  154. iproute.link("set", index=iproute.link_lookup(ifname=ifname)[0], master=iproute.link_lookup(ifname=bridge)[0])
  155. else:
  156. raise NetDhcpError(f'No Interface Library selected')
  157. except Exception as e:
  158. return
  159. def DelPort(library, bridge, ifname):
  160. try:
  161. if library == 'NDB':
  162. ndb.interfaces[bridge].del_port(ifname).commit()
  163. elif library == 'IPR':
  164. iproute.link("set", index=iproute.link_lookup(ifname=ifname)[0], master=0)
  165. else:
  166. raise NetDhcpError(f'No Interface Library selected')
  167. except Exception as e:
  168. return
  169. #-------------------------------
  170. def test_Variable(v1, v2, f):
  171. assert v1 == v2, "{} not equal ({}, {})".format(f, v1, v2)
  172. def test_Interface():
  173. InitializeLibrary('NDB')
  174. InitializeLibrary('IPR')
  175. itf1 = GetInterface('NDB', 'br0')
  176. itf2 = GetInterface('IPR', 'br0')
  177. test_Variable(itf1.ifname, itf2.ifname, 'ifname')
  178. test_Variable(itf1.kind, itf2.kind, 'kind')
  179. test_Variable(itf1.ipaddr(), itf2.ipaddr(), 'ipaddr')
  180. test_Variable(itf1.routes, itf2.routes, 'routes')
  181. print("OK")
  182. #test_Interface()
  183. def test_CreateInterface():
  184. InitializeLibrary('NDB')
  185. InitializeLibrary('IPR')
  186. CreateInterface('NDB', 'ndb0', 'veth', 'ndb1')
  187. CreateInterface('IPR', 'ipr0', 'veth', 'ipr1')
  188. itf1 = GetInterface('NDB', 'ndb0')
  189. itf2 = GetInterface('IPR', 'ipr0')
  190. itf1.Up();
  191. itf2.Up();
  192. itf3 = GetInterface('NDB', 'ndb1')
  193. itf4 = GetInterface('IPR', 'ipr1')
  194. itf3.SetAddress('00:11:22:33:44:55')
  195. itf4.SetAddress('00:11:22:33:44:56')
  196. itf3.Up();
  197. itf4.Up();
  198. AddPort('NDB', 'br0', 'ndb0')
  199. AddPort('IPR', 'br0', 'ipr0')
  200. #test_CreateInterface()
  201. def test_RemoveInterface():
  202. InitializeLibrary('NDB')
  203. InitializeLibrary('IPR')
  204. DelPort('NDB', 'br0', 'ndb0')
  205. DelPort('IPR', 'br0', 'ipr0')
  206. RemoveInterface('NDB', 'ndb0')
  207. RemoveInterface('IPR', 'ipr0')
  208. #test_RemoveInterface()