接⼝介绍(前⾔)
接⼝(interface)是⽹络设备⽤来处理各种连接媒介的抽象化的⼝,端⼝(port)是⽹络设备真实存在的物理意义上的⼝,端⼝⼀定是接⼝,接⼝不⼀定是端⼝。
class E接⼝(enum.IntEnum):
e空 = 0x00000000
e管理 = 0x00000001
e环回 = 0x00000100
e⼗兆以太⽹ = 0x00000210 #10M=10'000'000
e以太⽹ =  e⼗兆以太⽹
e百兆以太⽹ = 0x00000220 #100M=100'000'000
e快速以太⽹ =  e百兆以太⽹
e吉以太⽹ = 0x00000230    #1G=1'000M=1'000'000'000
e千兆以太⽹ = e吉以太⽹
e串⾏ = 0x00000400
e虚拟局域⽹ = 0x00000500
e隧道 = 0x00000600
我在写接⼝类型枚举时考虑到了别名的情况。如:百兆以太⽹=快速以太⽹、吉以太⽹=千兆以太⽹。这些别名的值是⼀样的,所以最后转换成设备对应的接⼝名称的结果也是⼀样。
(⽹络)接⼝配置模式(编程)接⼝
(⽹络)接⼝配置模式(编程)接⼝说明这是⼀个可以对(⽹络)接⼝做配置的(编程)接⼝
class I接⼝配置模式(I接⼝配置模式基础):  #常见的接⼝配置
def __init__(self, a, a接⼝):
I接⼝配置模式基础.__init__(self, a, a接⼝)
def fs开关(self, a开关):
raise NotImplementedError()
def fs描述(self, a描述, a操作 = E操作.e设置):
raise NotImplementedError()
def fs⽹络地址4(self, a地址, a操作 = E操作.e设置):
raise NotImplementedError()
因为(⽹络)接⼝命令太多,这段代码只列举⼏个常⽤的。
这⾥有⼀个 I接⼝配置模式基础,它是所有(⽹络)接⼝配置模式(编程)接⼝的基类,提供了不同的(⽹络)接⼝配置模式(编程)接⼝都能使⽤的通⽤函数,⽐如进⼊命令。 I接⼝配置模式 只提供常⽤操作,更详细的操作分散在不同的(⽹络)接⼝配置模式(编程)接⼝中,所有的(⽹络)接⼝配置模式(编程)接⼝都要继承 I接⼝配置模式基础 以保证⾏为⼀致以及避免重复代码。
class I接⼝配置模式基础(I模式):  #所有接⼝配置模式接⼝的基类
c模式名 = "接⼝配置模式"
def __init__(self, a设备, a接⼝):
I模式.__init__(self, a设备)
self.m接⼝ = a接⼝
def __eq__(self, a):
if not isinstance(a, I接⼝配置模式基础):
return False
return self.m接⼝ == a.m接⼝
#通⽤⽅法
def fg模式参数(self):
python基础代码100例return (self.m接⼝,)
def fg进⼊命令(self):
return C命令("interface") + self.fg模式参数()
def fg接⼝(self):
return self.m接⼝
写完(编程)接⼝还要写如何创建对象。⼏乎所有的⽹络设备都是从全局配置模式进⼊(⽹络)接⼝配置模式,所以我习惯性地把创建(⽹络)接⼝配置模式对象的函数放在全局配置模式(编程)接⼝中。
class I全局配置模式(I模式):
def f模式_接⼝配置(self, a接⼝, a操作 = E操作.e设置):
raise NotImplementedError()
其中 a接⼝ 可以是⼀个 S接⼝ 值,也可以是字符串。如果传了字符串,还要解析成 S接⼝ 值,以便于使⽤。具体解析过程见下⾯的解析
解析(⽹络)接⼝字符串⼀节
(⽹络)接⼝字符串
统⼀(⽹络)接⼝类型值转换成具体(⽹络)接⼝名称
上⾯说到,不同设备,同⼀种(⽹络)接⼝的名称可能不同。⽣成⼀个具体设备的具体命令需要把(⽹络)接⼝类型值转换成⼀个准确的名称。这个很好实现,只要写个字典,根据类型值查字典即可。
我以思科设备的接⼝名称为范本写了⼀个接⼝名称字典。
ca接⼝名称 = {
E接⼝.e空: "Null",
E接⼝.e环回: "Loopback",
E接⼝.e以太⽹: "Ethernet",
E接⼝.e快速以太⽹: "FastEthernet",
E接⼝.e吉以太⽹: "GigabitEthernet",
E接⼝.e⼗吉以太⽹: "TenGigabitEthernet",
E接⼝.e串⾏: "Serial",
E接⼝.e虚拟局域⽹: "Vlan",
E接⼝.e隧道: "Tunnel"
}
在 S接⼝ 中添加相关函数:
class S接⼝:
def __str__(self):
if self.m名称:
return self.m名称 + self.fg序号字符串()
else:
return self.ft字符串(ca接⼝名称)
def fg序号字符串(self):
"包含⼦序号"
#转成字符串列表
v列表 = list(self.ma序号)
v⼦序号 = self.m⼦序号
for i in range(len(v列表)):
v = v列表[i]
if type(v) == range:
v列表[i] = str(v.start) + "-" + str(v.stop - 1)
else:
v列表[i] = str(v)
s = '/'.join(v列表)
if v⼦序号:
s += '.' + str(v⼦序号)
return s
def fg名称(self, a字典 = None):
"根据类型值查字典取名称"
if a字典:
阿里巴巴java开发手册 嵩山版return a字典[self.m类型]
elif self.m名称:
蜜芽tv跳转接口点击进入网页>sql server数据库对比工具return self.m名称
else:
return ca接⼝名称[self.m类型]
def ft字符串(self, a字典 = ca接⼝名称):
return self.fg名称(a字典) + self.fg序号字符串()
细分的(⽹络)接⼝配置模式
接⼝介绍(前⾔)⼀节说到,接⼝配置模式命令⾮常多,且不同的(⽹络)接⼝类型有不同的命令,把所有命令放在⼀个(编程)接⼝中不现在接⼝介绍(前⾔)
实,所以需要对(⽹络)接⼝配置模式(编程)接⼝细分成详细的⼦模式。
为了提⾼开发效率,降低进⼊⼦模式的频率,我把常⽤的、数量少的命令放在(⽹络)接⼝主模式中:
描述
(⽹络)接⼝开关
设置⽹络地址、物理地址
设置以太⽹⼝的速率、双⼯模式
(⽹络)接⼝策略:访问控制列表、服务质量
然后把不常⽤的,或者只有特定场合才⽤得到的命令放在⼦模式:
虚拟局域⽹
各种动态路由协议
端⼝安全
等……
在(⽹络)接⼝配置模式(编程)接⼝添加创建详细的(⽹络)接⼝配置模式模式对象的⼊⼝
class I接⼝配置模式(I接⼝配置模式基础):
def f模式_虚拟局域⽹(self):
raise NotImplementedError()
def f模式_端⼝安全(self):
raise NotImplementedError()
def f模式_⽣成树(self):
raise NotImplementedError()
多种进⼊(⽹络)接⼝⼦模式的途径
万维网的缩写(⽹络)接⼝配置模式按功能分成很多⼦模式,(⽹络)接⼝的命令跨越不同⽹络层次不同协议,因为功能太多导致(⽹络)接⼝的功能不可避免地跟其他模式交叉。
例如:在开放最短路径优先配置模式配置了⼀些路由常⽤命令之后,⼜要进(⽹络)接⼝配置模式配置⼀些(⽹络)接⼝独有命令,如果再从全局配置模式逐步创建开放最短路径优先(⽹络)接⼝配置模式对象会显得很繁琐:
v路由配置 = v全局配置.f模式_开放最短路径优先()
v路由配置.fs通告路由("1.1.1.1/24", a区域号 = 0)
v接⼝配置 = v全局配置.f模式_接⼝("f0/0")
v路由接⼝配置 = v接⼝配置.f模式_开放最短路径优先()
v路由接⼝配置.fs开销(100)
这段脚本放在思科设备中会变成以下命令:
router ospf 1
network 1.1.1.1 0.0.0.255 area 0
exit
interface FastEthernet0/0
ip ospf cost 100
电脑编程好学吗1717
为了避免这种繁琐的从头创建模式对象,我在(编程)接⼝设计中添加了从⼀个模式进⼊相关模式的函数。像上⾯的例⼦,可以直接从开放最短路径优先配置模式进⼊开放最短路径优先(⽹络)接⼝配置模式。
快速进⼊开放最短路径优先接⼝配置模式
快速进⼊虚拟局域⽹接⼝配置模式(⽹络)接⼝范围

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。