network-utility 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +2 -0
- data/document/acl-M6000-16E.md +27 -0
- data/document/acl-M6000-18S.md +27 -0
- data/document/acl-M6000-8.md +27 -0
- data/document/acl-M6000-8E.md +27 -0
- data/document/acl-MA5200G-8.md +204 -0
- data/document/acl-ME60-16.md +177 -0
- data/document/acl-ME60-X16.md +177 -0
- data/document/acl-NE40E-X16.md +204 -0
- data/document/acl-NE40E-X16A.md +204 -0
- data/document/acl-NE40E-X8.md +204 -0
- data/document/acl-NE40E.md +204 -0
- data/document/acl-NE5000E-20.md +25 -0
- data/document/acl-NE5000E-X16.md +25 -0
- data/document/acl-NE5000E-X16A.md +25 -0
- data/document/acl-NE80E.md +204 -0
- data/document/bgp-CR16010H-F.md +25 -0
- data/document/bgp-CR16018-F.md +25 -0
- data/document/bgp-CR19000-20.md +25 -0
- data/document/bgp-M6000-16E.md +25 -0
- data/document/bgp-M6000-18S.md +25 -0
- data/document/bgp-M6000-8.md +25 -0
- data/document/bgp-M6000-8E.md +25 -0
- data/document/bgp-MA5200G-8.md +25 -0
- data/document/bgp-ME60-16.md +25 -0
- data/document/bgp-ME60-X16.md +25 -0
- data/document/bgp-NE40E-X16.md +25 -0
- data/document/bgp-NE40E-X16A.md +25 -0
- data/document/bgp-NE40E-X8.md +25 -0
- data/document/bgp-NE40E.md +25 -0
- data/document/bgp-NE5000E-20.md +25 -0
- data/document/bgp-NE5000E-X16.md +25 -0
- data/document/bgp-NE5000E-X16A.md +25 -0
- data/document/bgp-NE80E.md +25 -0
- data/document/config.md +1153 -0
- data/document/document.rb +27 -0
- data/document/if-ALCATEL7750.md +48 -0
- data/document/if-C7609.md +47 -0
- data/document/if-CR16010H-F.md +300 -0
- data/document/if-CR16018-F.md +300 -0
- data/document/if-CR19000-20.md +300 -0
- data/document/if-CRS-16.md +47 -0
- data/document/if-CX600-X16A.md +349 -0
- data/document/if-CX600-X8A.md +349 -0
- data/document/if-M6000-16E.md +652 -0
- data/document/if-M6000-18S.md +846 -0
- data/document/if-M6000-8.md +653 -0
- data/document/if-M6000-8E.md +653 -0
- data/document/if-MA5200G-8.md +357 -0
- data/document/if-ME60-16.md +357 -0
- data/document/if-ME60-X16.md +357 -0
- data/document/if-NE40E-X16.md +357 -0
- data/document/if-NE40E-X16A.md +357 -0
- data/document/if-NE40E-X8.md +357 -0
- data/document/if-NE40E.md +357 -0
- data/document/if-NE5000E-20.md +357 -0
- data/document/if-NE5000E-X16.md +357 -0
- data/document/if-NE5000E-X16A.md +357 -0
- data/document/if-NE8000E-X8.md +357 -0
- data/document/if-NE80E.md +357 -0
- data/document/if-NE8100-X8.md +357 -0
- data/document/if-Nokia7750.md +48 -0
- data/document/if-T8000-18.md +653 -0
- data/document/if-V6000.md +663 -0
- data/document/if-VNE9000.md +357 -0
- data/document/if-ZXCTN9000-18EA.md +762 -0
- data/document/if-ZXCTN9000-8EA.md +762 -0
- data/document/lic-M6000-16E.md +28 -0
- data/document/lic-M6000-18S.md +28 -0
- data/document/lic-M6000-8.md +28 -0
- data/document/lic-M6000-8E.md +28 -0
- data/document/lic-MA5200G-8.md +27 -0
- data/document/lic-ME60-16.md +27 -0
- data/document/lic-ME60-X16.md +27 -0
- data/document/lic-NE40E-X16.md +27 -0
- data/document/lic-NE40E-X16A.md +27 -0
- data/document/lic-NE40E-X8.md +27 -0
- data/document/log-M6000-16E.md +36 -0
- data/document/log-M6000-18S.md +36 -0
- data/document/log-M6000-8.md +36 -0
- data/document/log-M6000-8E.md +36 -0
- data/document/log-MA5200G-8.md +61 -0
- data/document/log-ME60-16.md +61 -0
- data/document/log-ME60-X16.md +61 -0
- data/document/log-NE40E-X16.md +61 -0
- data/document/log-NE40E-X16A.md +61 -0
- data/document/log-NE40E-X8.md +61 -0
- data/document/log-NE40E.md +61 -0
- data/document/log-NE5000E-20.md +61 -0
- data/document/log-NE5000E-X16.md +61 -0
- data/document/log-NE5000E-X16A.md +61 -0
- data/document/log-NE80E.md +61 -0
- data/document/nat-CR16010H-F.md +27 -0
- data/document/nat-CR16018-F.md +27 -0
- data/document/nat-M6000-16E.md +27 -0
- data/document/nat-M6000-18S.md +27 -0
- data/document/nat-M6000-8.md +27 -0
- data/document/nat-M6000-8E.md +27 -0
- data/document/nat-ME60-16.md +44 -0
- data/document/nat-ME60-X16.md +44 -0
- data/document/nat-NE40E-X16.md +44 -0
- data/document/nat-NE40E-X16A.md +44 -0
- data/document/policy-M6000-16E.md +13 -0
- data/document/policy-M6000-18S.md +13 -0
- data/document/policy-M6000-8.md +13 -0
- data/document/policy-M6000-8E.md +13 -0
- data/document/policy-MA5200G-8.md +87 -0
- data/document/policy-ME60-16.md +87 -0
- data/document/policy-ME60-X16.md +87 -0
- data/document/policy-NE40E-X16.md +87 -0
- data/document/policy-NE40E-X16A.md +87 -0
- data/document/policy-NE40E-X8.md +87 -0
- data/document/policy-NE40E.md +87 -0
- data/document/policy-NE5000E-20.md +87 -0
- data/document/policy-NE5000E-X16.md +87 -0
- data/document/policy-NE5000E-X16A.md +87 -0
- data/document/policy-NE80E.md +87 -0
- data/document/pool-M6000-16E.md +126 -0
- data/document/pool-M6000-18S.md +126 -0
- data/document/pool-M6000-8.md +126 -0
- data/document/pool-M6000-8E.md +126 -0
- data/document/pool-MA5200G-8.md +138 -0
- data/document/pool-ME60-16.md +138 -0
- data/document/pool-ME60-X16.md +138 -0
- data/document/pool-NE40E-X16.md +138 -0
- data/document/pool-NE40E-X16A.md +138 -0
- data/document/pool-NE40E-X8.md +138 -0
- data/document/pool-NE40E.md +138 -0
- data/document/pool-NE80E.md +138 -0
- data/document/static-CR16010H-F.md +60 -0
- data/document/static-CR16018-F.md +60 -0
- data/document/static-CR19000-20.md +60 -0
- data/document/static-CX600-X16A.md +26 -0
- data/document/static-CX600-X8A.md +26 -0
- data/document/static-M6000-16E.md +104 -0
- data/document/static-M6000-18S.md +104 -0
- data/document/static-M6000-8.md +104 -0
- data/document/static-M6000-8E.md +104 -0
- data/document/static-MA5200G-8.md +82 -0
- data/document/static-ME60-16.md +82 -0
- data/document/static-ME60-X16.md +82 -0
- data/document/static-NE40E-X16.md +82 -0
- data/document/static-NE40E-X16A.md +81 -0
- data/document/static-NE40E-X8.md +82 -0
- data/document/static-NE40E.md +67 -0
- data/document/static-NE5000E-20.md +67 -0
- data/document/static-NE5000E-X16.md +67 -0
- data/document/static-NE5000E-X16A.md +67 -0
- data/document/static-NE8000E-X8.md +26 -0
- data/document/static-NE80E.md +67 -0
- data/document/static-NE8100-X8.md +26 -0
- data/document/static-T8000-18.md +34 -0
- data/document/static-ZXCTN9000-18EA.md +34 -0
- data/document/static-ZXCTN9000-8EA.md +34 -0
- data/document/system-M6000-16E.md +75 -0
- data/document/system-M6000-18S.md +76 -0
- data/document/system-M6000-8.md +75 -0
- data/document/system-M6000-8E.md +75 -0
- data/document/system-MA5200G-8.md +51 -0
- data/document/system-ME60-16.md +51 -0
- data/document/system-ME60-X16.md +51 -0
- data/document/system-NE40E-X16.md +51 -0
- data/document/system-NE40E-X16A.md +51 -0
- data/document/system-NE40E-X8.md +51 -0
- data/document/system-NE40E.md +51 -0
- data/document/system-NE5000E-20.md +51 -0
- data/document/system-NE5000E-X16.md +51 -0
- data/document/system-NE5000E-X16A.md +51 -0
- data/document/system-NE80E.md +51 -0
- data/document/telnet.md +332 -0
- data/network.rb +24 -0
- data/utility/ipv4_address.rb +266 -0
- data/utility/ipv6_address.rb +201 -0
- data/utility/mac_address.rb +77 -0
- data/utility/netmerge.rb +46 -0
- data/utility/route.rb +79 -0
- data/utility/whitelist.rb +21 -0
- metadata +258 -0
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
# ME60-X16 地址池
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
@sign << ['ME60-X16', '地址池解析']
|
6
|
+
@sign << ['ME60-X16', 'nat地址配置']
|
7
|
+
@sign << ['ME60-X16', 'sub_range']
|
8
|
+
@sign << ['ME60-X16', '地址池日志']
|
9
|
+
|
10
|
+
module ME60_X16
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def 地址池解析 配置散列
|
14
|
+
地址池列表 = []
|
15
|
+
地址池配置 = 配置散列['ip'].select{|配置|配置.include?('ip pool')}
|
16
|
+
地址池配置.each do|地址池|参数 = {}
|
17
|
+
地址池.each_line do|line|
|
18
|
+
if line.include?('ip pool') and (args = line.split('ip pool ')[-1].split(' '))
|
19
|
+
参数['name'] = args[0]
|
20
|
+
参数['mode'] = args[1..-1].join(' ')
|
21
|
+
end
|
22
|
+
if line.include?('gateway') and (args = line.split('gateway ')[-1].split(' '))
|
23
|
+
参数['gateway'] = args[0]
|
24
|
+
参数['gatemsk'] = args[1]
|
25
|
+
end
|
26
|
+
if line.include?('section') and (args = line.split('section ')[-1].split(' '))
|
27
|
+
参数['section'] ||= []
|
28
|
+
参数['section'] << [args[1],args[2]] # 0:index 1:start 2:end
|
29
|
+
end
|
30
|
+
if line.include?('vpn-instance') and (args = line.split('vpn-instance ')[-1].split(' '))
|
31
|
+
参数['vpn-instance'] = args.first
|
32
|
+
end
|
33
|
+
if line.include?('dns-server') and (args = line.split('dns-server ')[-1].split(' '))
|
34
|
+
参数['dns-server'] = args
|
35
|
+
end
|
36
|
+
end
|
37
|
+
地址池列表 << 参数
|
38
|
+
end
|
39
|
+
地址池列表
|
40
|
+
end
|
41
|
+
|
42
|
+
def nat地址配置 配置散列
|
43
|
+
地址池列表 = [];参数 = {}
|
44
|
+
return 地址池列表 unless 配置散列['nat']
|
45
|
+
地址池配置 = 配置散列['nat'].select{|配置|配置.include?('nat instance ')}
|
46
|
+
地址池配置.each do|片段|
|
47
|
+
片段.each_line do|line|
|
48
|
+
if line.include?("nat instance")
|
49
|
+
地址池列表 << 参数 if 参数!={}
|
50
|
+
参数 = {}
|
51
|
+
参数['instance name'] = line.split("instance ")[1].split(" ")[0].strip
|
52
|
+
参数['instance id'] = line.split("instance ")[1].split("id ")[1].strip
|
53
|
+
end
|
54
|
+
参数['port-range'] = line.split("port-range")[1].strip if line.include?("port-range")
|
55
|
+
参数['instance group'] = line.split("service-instance-group")[1].strip if line.include?("service-instance-group")
|
56
|
+
if line.include?("nat address-group")
|
57
|
+
参数['address group'] ||= {}
|
58
|
+
参数['address group']['name'] = line.split("nat address-group ")[1].split(" ")[0].strip
|
59
|
+
参数['address group']['id'] = line.split("nat address-group ")[1].split("id ")[1].strip
|
60
|
+
end
|
61
|
+
if line.include?("section")
|
62
|
+
next if line.include?('lock')
|
63
|
+
参数['address group']['pool'] ||= []
|
64
|
+
if line.include?('mask') # section NUM NETWORK mask NETMASK
|
65
|
+
a,section,net,b,masknum = line.split(" ")
|
66
|
+
pool,mask = IP.v4("#{net}/#{masknum}")
|
67
|
+
参数['address group']['pool'] << [section,pool.to_d,mask.to_d]
|
68
|
+
elsif line.include?('exclude-ip-address') # section NUM exclude-ip-address START FINISH
|
69
|
+
a, session, exclude, exstart, exfinish = line.split(' ')
|
70
|
+
except_session = 参数['address group']['pool'].find{|s|s[0]==session}
|
71
|
+
next unless except_session
|
72
|
+
start, finish = except_session[1], except_session[2]
|
73
|
+
if IP.v4(finish).is_mask?
|
74
|
+
rstart, rfinish = IP.v4(start).range_with(IP.v4(finish))
|
75
|
+
new_ranges = sub_range([rstart.number-1, rfinish.number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
76
|
+
else
|
77
|
+
new_ranges = sub_range([IP.v4(start).number, IP.v4(finish).number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
78
|
+
end
|
79
|
+
new_ranges.each do|new_range|
|
80
|
+
# if empty, only delete old_range
|
81
|
+
参数['address group']['pool'] << [session, (IP.v4('0.0.0.0')+new_range[0]).to_d, (IP.v4('0.0.0.0')+new_range[1]).to_d]
|
82
|
+
end
|
83
|
+
参数['address group']['pool'].delete(except_session)
|
84
|
+
else # section NUM START FINISH
|
85
|
+
a, session, start, finish = line.split(' ')
|
86
|
+
参数['address group']['pool'] << [section,start,finish ]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
参数['address group']['outbound'] = line.split("outbound")[1].split(" ")[0] if line.include?("nat outbound")
|
90
|
+
end
|
91
|
+
|
92
|
+
地址池列表 << 参数
|
93
|
+
end
|
94
|
+
地址池列表
|
95
|
+
end
|
96
|
+
|
97
|
+
# 从一段地址范围中排除另一段地址范围 :=> 空,一段,两段地址范围
|
98
|
+
def sub_range old_range, exclude_range
|
99
|
+
a_start, a_end = old_range
|
100
|
+
b_start, b_end = exclude_range
|
101
|
+
result = []
|
102
|
+
if a_start < b_start
|
103
|
+
result << [a_start, [a_end, b_start - 1].min]
|
104
|
+
end
|
105
|
+
if a_end > b_end
|
106
|
+
result << [[b_end + 1, a_start].max, a_end]
|
107
|
+
end
|
108
|
+
result
|
109
|
+
end
|
110
|
+
|
111
|
+
def 地址池日志 详细信息
|
112
|
+
地址池列表 = [];时间标签 = Time.now.form
|
113
|
+
分片信息 = 详细信息.split("IP address pool Statistic")[0].to_s.split("-----------------------------------------------------------------------\n")[1..-1]
|
114
|
+
分片信息.each do|片段|单池 = {"Scan Time"=>时间标签}
|
115
|
+
单池['Pool Name'] = /Pool\-Name( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
116
|
+
单池['Pool No'] = /Pool\-No( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
117
|
+
单池['Pool Constant Index'] = /Pool\-constant\-index( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
118
|
+
单池['Position'] = /Position( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
119
|
+
单池['Status'] = /Status( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
120
|
+
单池['RUI Flag'] = /RUI\-Flag( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
121
|
+
单池['Gateway'] = /Gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
122
|
+
单池['Mask'] = /Mask( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
123
|
+
单池['Vpn Instance'] = /Vpn instance( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
124
|
+
单池['Unnumbered Gateway'] = /Unnumbered gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
125
|
+
单池['Total'] = /Total( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
126
|
+
单池['Used'] = /Used( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
127
|
+
单池['Free'] = /Free( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
128
|
+
单池['Conflicted'] = /Conflicted( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
129
|
+
单池['Disable'] = /Disable( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
130
|
+
单池['Designated'] = /Designated( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
131
|
+
# NoNeed #单池['Gateway'] = /Gateway :(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
132
|
+
单池['Ratio'] = /Ratio( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
133
|
+
地址池列表 << 单池
|
134
|
+
end
|
135
|
+
地址池列表
|
136
|
+
end
|
137
|
+
end
|
138
|
+
```
|
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
# NE40E-X16 地址池
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
@sign << ['NE40E-X16', '地址池解析']
|
6
|
+
@sign << ['NE40E-X16', 'nat地址配置']
|
7
|
+
@sign << ['NE40E-X16', 'sub_range']
|
8
|
+
@sign << ['NE40E-X16', '地址池日志']
|
9
|
+
|
10
|
+
module NE40E_X16
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def 地址池解析 配置散列
|
14
|
+
地址池列表 = []
|
15
|
+
地址池配置 = 配置散列['ip'].select{|配置|配置.include?('ip pool')}
|
16
|
+
地址池配置.each do|地址池|参数 = {}
|
17
|
+
地址池.each_line do|line|
|
18
|
+
if line.include?('ip pool') and (args = line.split('ip pool ')[-1].split(' '))
|
19
|
+
参数['name'] = args[0]
|
20
|
+
参数['mode'] = args[1..-1].join(' ')
|
21
|
+
end
|
22
|
+
if line.include?('gateway') and (args = line.split('gateway ')[-1].split(' '))
|
23
|
+
参数['gateway'] = args[0]
|
24
|
+
参数['gatemsk'] = args[1]
|
25
|
+
end
|
26
|
+
if line.include?('section') and (args = line.split('section ')[-1].split(' '))
|
27
|
+
参数['section'] ||= []
|
28
|
+
参数['section'] << [args[1],args[2]] # 0:index 1:start 2:end
|
29
|
+
end
|
30
|
+
if line.include?('vpn-instance') and (args = line.split('vpn-instance ')[-1].split(' '))
|
31
|
+
参数['vpn-instance'] = args.first
|
32
|
+
end
|
33
|
+
if line.include?('dns-server') and (args = line.split('dns-server ')[-1].split(' '))
|
34
|
+
参数['dns-server'] = args
|
35
|
+
end
|
36
|
+
end
|
37
|
+
地址池列表 << 参数
|
38
|
+
end
|
39
|
+
地址池列表
|
40
|
+
end
|
41
|
+
|
42
|
+
def nat地址配置 配置散列
|
43
|
+
地址池列表 = [];参数 = {}
|
44
|
+
return 地址池列表 unless 配置散列['nat']
|
45
|
+
地址池配置 = 配置散列['nat'].select{|配置|配置.include?('nat instance ')}
|
46
|
+
地址池配置.each do|片段|
|
47
|
+
片段.each_line do|line|
|
48
|
+
if line.include?("nat instance")
|
49
|
+
地址池列表 << 参数 if 参数!={}
|
50
|
+
参数 = {}
|
51
|
+
参数['instance name'] = line.split("instance ")[1].split(" ")[0].strip
|
52
|
+
参数['instance id'] = line.split("instance ")[1].split("id ")[1].strip
|
53
|
+
end
|
54
|
+
参数['port-range'] = line.split("port-range")[1].strip if line.include?("port-range")
|
55
|
+
参数['instance group'] = line.split("service-instance-group")[1].strip if line.include?("service-instance-group")
|
56
|
+
if line.include?("nat address-group")
|
57
|
+
参数['address group'] ||= {}
|
58
|
+
参数['address group']['name'] = line.split("nat address-group ")[1].split(" ")[0].strip
|
59
|
+
参数['address group']['id'] = line.split("nat address-group ")[1].split("id ")[1].strip
|
60
|
+
end
|
61
|
+
if line.include?("section")
|
62
|
+
next if line.include?('lock')
|
63
|
+
参数['address group']['pool'] ||= []
|
64
|
+
if line.include?('mask') # section NUM NETWORK mask NETMASK
|
65
|
+
a,section,net,b,masknum = line.split(" ")
|
66
|
+
pool,mask = IP.v4("#{net}/#{masknum}")
|
67
|
+
参数['address group']['pool'] << [section,pool.to_d,mask.to_d]
|
68
|
+
elsif line.include?('exclude-ip-address') # section NUM exclude-ip-address START FINISH
|
69
|
+
a, session, exclude, exstart, exfinish = line.split(' ')
|
70
|
+
except_session = 参数['address group']['pool'].find{|s|s[0]==session}
|
71
|
+
next unless except_session
|
72
|
+
start, finish = except_session[1], except_session[2]
|
73
|
+
if IP.v4(finish).is_mask?
|
74
|
+
rstart, rfinish = IP.v4(start).range_with(IP.v4(finish))
|
75
|
+
new_ranges = sub_range([rstart.number-1, rfinish.number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
76
|
+
else
|
77
|
+
new_ranges = sub_range([IP.v4(start).number, IP.v4(finish).number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
78
|
+
end
|
79
|
+
new_ranges.each do|new_range|
|
80
|
+
# if empty, only delete old_range
|
81
|
+
参数['address group']['pool'] << [session, (IP.v4('0.0.0.0')+new_range[0]).to_d, (IP.v4('0.0.0.0')+new_range[1]).to_d]
|
82
|
+
end
|
83
|
+
参数['address group']['pool'].delete(except_session)
|
84
|
+
else # section NUM START FINISH
|
85
|
+
a, session, start, finish = line.split(' ')
|
86
|
+
参数['address group']['pool'] << [section,start,finish ]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
参数['address group']['outbound'] = line.split("outbound")[1].split(" ")[0] if line.include?("nat outbound")
|
90
|
+
end
|
91
|
+
|
92
|
+
地址池列表 << 参数
|
93
|
+
end
|
94
|
+
地址池列表
|
95
|
+
end
|
96
|
+
|
97
|
+
# 从一段地址范围中排除另一段地址范围 :=> 空,一段,两段地址范围
|
98
|
+
def sub_range old_range, exclude_range
|
99
|
+
a_start, a_end = old_range
|
100
|
+
b_start, b_end = exclude_range
|
101
|
+
result = []
|
102
|
+
if a_start < b_start
|
103
|
+
result << [a_start, [a_end, b_start - 1].min]
|
104
|
+
end
|
105
|
+
if a_end > b_end
|
106
|
+
result << [[b_end + 1, a_start].max, a_end]
|
107
|
+
end
|
108
|
+
result
|
109
|
+
end
|
110
|
+
|
111
|
+
def 地址池日志 详细信息
|
112
|
+
地址池列表 = [];时间标签 = Time.now.form
|
113
|
+
分片信息 = 详细信息.split("IP address pool Statistic")[0].to_s.split("-----------------------------------------------------------------------\n")[1..-1]
|
114
|
+
分片信息.each do|片段|单池 = {"Scan Time"=>时间标签}
|
115
|
+
单池['Pool Name'] = /Pool\-Name( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
116
|
+
单池['Pool No'] = /Pool\-No( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
117
|
+
单池['Pool Constant Index'] = /Pool\-constant\-index( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
118
|
+
单池['Position'] = /Position( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
119
|
+
单池['Status'] = /Status( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
120
|
+
单池['RUI Flag'] = /RUI\-Flag( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
121
|
+
单池['Gateway'] = /Gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
122
|
+
单池['Mask'] = /Mask( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
123
|
+
单池['Vpn Instance'] = /Vpn instance( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
124
|
+
单池['Unnumbered Gateway'] = /Unnumbered gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
125
|
+
单池['Total'] = /Total( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
126
|
+
单池['Used'] = /Used( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
127
|
+
单池['Free'] = /Free( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
128
|
+
单池['Conflicted'] = /Conflicted( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
129
|
+
单池['Disable'] = /Disable( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
130
|
+
单池['Designated'] = /Designated( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
131
|
+
# NoNeed #单池['Gateway'] = /Gateway :(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
132
|
+
单池['Ratio'] = /Ratio( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
133
|
+
地址池列表 << 单池
|
134
|
+
end
|
135
|
+
地址池列表
|
136
|
+
end
|
137
|
+
end
|
138
|
+
```
|
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
# NE40E-X16A 地址池
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
@sign << ['NE40E-X16A', '地址池解析']
|
6
|
+
@sign << ['NE40E-X16A', 'nat地址配置']
|
7
|
+
@sign << ['NE40E-X16A', 'sub_range']
|
8
|
+
@sign << ['NE40E-X16A', '地址池日志']
|
9
|
+
|
10
|
+
module NE40E_X16A
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def 地址池解析 配置散列
|
14
|
+
地址池列表 = []
|
15
|
+
地址池配置 = 配置散列['ip'].select{|配置|配置.include?('ip pool')}
|
16
|
+
地址池配置.each do|地址池|参数 = {}
|
17
|
+
地址池.each_line do|line|
|
18
|
+
if line.include?('ip pool') and (args = line.split('ip pool ')[-1].split(' '))
|
19
|
+
参数['name'] = args[0]
|
20
|
+
参数['mode'] = args[1..-1].join(' ')
|
21
|
+
end
|
22
|
+
if line.include?('gateway') and (args = line.split('gateway ')[-1].split(' '))
|
23
|
+
参数['gateway'] = args[0]
|
24
|
+
参数['gatemsk'] = args[1]
|
25
|
+
end
|
26
|
+
if line.include?('section') and (args = line.split('section ')[-1].split(' '))
|
27
|
+
参数['section'] ||= []
|
28
|
+
参数['section'] << [args[1],args[2]] # 0:index 1:start 2:end
|
29
|
+
end
|
30
|
+
if line.include?('vpn-instance') and (args = line.split('vpn-instance ')[-1].split(' '))
|
31
|
+
参数['vpn-instance'] = args.first
|
32
|
+
end
|
33
|
+
if line.include?('dns-server') and (args = line.split('dns-server ')[-1].split(' '))
|
34
|
+
参数['dns-server'] = args
|
35
|
+
end
|
36
|
+
end
|
37
|
+
地址池列表 << 参数
|
38
|
+
end
|
39
|
+
地址池列表
|
40
|
+
end
|
41
|
+
|
42
|
+
def nat地址配置 配置散列
|
43
|
+
地址池列表 = [];参数 = {}
|
44
|
+
return 地址池列表 unless 配置散列['nat']
|
45
|
+
地址池配置 = 配置散列['nat'].select{|配置|配置.include?('nat instance ')}
|
46
|
+
地址池配置.each do|片段|
|
47
|
+
片段.each_line do|line|
|
48
|
+
if line.include?("nat instance")
|
49
|
+
地址池列表 << 参数 if 参数!={}
|
50
|
+
参数 = {}
|
51
|
+
参数['instance name'] = line.split("instance ")[1].split(" ")[0].strip
|
52
|
+
参数['instance id'] = line.split("instance ")[1].split("id ")[1].strip
|
53
|
+
end
|
54
|
+
参数['port-range'] = line.split("port-range")[1].strip if line.include?("port-range")
|
55
|
+
参数['instance group'] = line.split("service-instance-group")[1].strip if line.include?("service-instance-group")
|
56
|
+
if line.include?("nat address-group")
|
57
|
+
参数['address group'] ||= {}
|
58
|
+
参数['address group']['name'] = line.split("nat address-group ")[1].split(" ")[0].strip
|
59
|
+
参数['address group']['id'] = line.split("nat address-group ")[1].split("id ")[1].strip
|
60
|
+
end
|
61
|
+
if line.include?("section")
|
62
|
+
next if line.include?('lock')
|
63
|
+
参数['address group']['pool'] ||= []
|
64
|
+
if line.include?('mask') # section NUM NETWORK mask NETMASK
|
65
|
+
a,section,net,b,masknum = line.split(" ")
|
66
|
+
pool,mask = IP.v4("#{net}/#{masknum}")
|
67
|
+
参数['address group']['pool'] << [section,pool.to_d,mask.to_d]
|
68
|
+
elsif line.include?('exclude-ip-address') # section NUM exclude-ip-address START FINISH
|
69
|
+
a, session, exclude, exstart, exfinish = line.split(' ')
|
70
|
+
except_session = 参数['address group']['pool'].find{|s|s[0]==session}
|
71
|
+
next unless except_session
|
72
|
+
start, finish = except_session[1], except_session[2]
|
73
|
+
if IP.v4(finish).is_mask?
|
74
|
+
rstart, rfinish = IP.v4(start).range_with(IP.v4(finish))
|
75
|
+
new_ranges = sub_range([rstart.number-1, rfinish.number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
76
|
+
else
|
77
|
+
new_ranges = sub_range([IP.v4(start).number, IP.v4(finish).number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
78
|
+
end
|
79
|
+
new_ranges.each do|new_range|
|
80
|
+
# if empty, only delete old_range
|
81
|
+
参数['address group']['pool'] << [session, (IP.v4('0.0.0.0')+new_range[0]).to_d, (IP.v4('0.0.0.0')+new_range[1]).to_d]
|
82
|
+
end
|
83
|
+
参数['address group']['pool'].delete(except_session)
|
84
|
+
else # section NUM START FINISH
|
85
|
+
a, session, start, finish = line.split(' ')
|
86
|
+
参数['address group']['pool'] << [section,start,finish ]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
参数['address group']['outbound'] = line.split("outbound")[1].split(" ")[0] if line.include?("nat outbound")
|
90
|
+
end
|
91
|
+
|
92
|
+
地址池列表 << 参数
|
93
|
+
end
|
94
|
+
地址池列表
|
95
|
+
end
|
96
|
+
|
97
|
+
# 从一段地址范围中排除另一段地址范围 :=> 空,一段,两段地址范围
|
98
|
+
def sub_range old_range, exclude_range
|
99
|
+
a_start, a_end = old_range
|
100
|
+
b_start, b_end = exclude_range
|
101
|
+
result = []
|
102
|
+
if a_start < b_start
|
103
|
+
result << [a_start, [a_end, b_start - 1].min]
|
104
|
+
end
|
105
|
+
if a_end > b_end
|
106
|
+
result << [[b_end + 1, a_start].max, a_end]
|
107
|
+
end
|
108
|
+
result
|
109
|
+
end
|
110
|
+
|
111
|
+
def 地址池日志 详细信息
|
112
|
+
地址池列表 = [];时间标签 = Time.now.form
|
113
|
+
分片信息 = 详细信息.split("IP address pool Statistic")[0].to_s.split("-----------------------------------------------------------------------\n")[1..-1]
|
114
|
+
分片信息.each do|片段|单池 = {"Scan Time"=>时间标签}
|
115
|
+
单池['Pool Name'] = /Pool\-Name( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
116
|
+
单池['Pool No'] = /Pool\-No( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
117
|
+
单池['Pool Constant Index'] = /Pool\-constant\-index( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
118
|
+
单池['Position'] = /Position( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
119
|
+
单池['Status'] = /Status( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
120
|
+
单池['RUI Flag'] = /RUI\-Flag( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
121
|
+
单池['Gateway'] = /Gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
122
|
+
单池['Mask'] = /Mask( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
123
|
+
单池['Vpn Instance'] = /Vpn instance( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
124
|
+
单池['Unnumbered Gateway'] = /Unnumbered gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
125
|
+
单池['Total'] = /Total( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
126
|
+
单池['Used'] = /Used( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
127
|
+
单池['Free'] = /Free( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
128
|
+
单池['Conflicted'] = /Conflicted( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
129
|
+
单池['Disable'] = /Disable( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
130
|
+
单池['Designated'] = /Designated( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
131
|
+
# NoNeed #单池['Gateway'] = /Gateway :(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
132
|
+
单池['Ratio'] = /Ratio( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
133
|
+
地址池列表 << 单池
|
134
|
+
end
|
135
|
+
地址池列表
|
136
|
+
end
|
137
|
+
end
|
138
|
+
```
|
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
# NE40E-X8 地址池
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
@sign << ['NE40E-X8', '地址池解析']
|
6
|
+
@sign << ['NE40E-X8', 'nat地址配置']
|
7
|
+
@sign << ['NE40E-X8', 'sub_range']
|
8
|
+
@sign << ['NE40E-X8', '地址池日志']
|
9
|
+
|
10
|
+
module NE40E_X8
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def 地址池解析 配置散列
|
14
|
+
地址池列表 = []
|
15
|
+
地址池配置 = 配置散列['ip'].select{|配置|配置.include?('ip pool')}
|
16
|
+
地址池配置.each do|地址池|参数 = {}
|
17
|
+
地址池.each_line do|line|
|
18
|
+
if line.include?('ip pool') and (args = line.split('ip pool ')[-1].split(' '))
|
19
|
+
参数['name'] = args[0]
|
20
|
+
参数['mode'] = args[1..-1].join(' ')
|
21
|
+
end
|
22
|
+
if line.include?('gateway') and (args = line.split('gateway ')[-1].split(' '))
|
23
|
+
参数['gateway'] = args[0]
|
24
|
+
参数['gatemsk'] = args[1]
|
25
|
+
end
|
26
|
+
if line.include?('section') and (args = line.split('section ')[-1].split(' '))
|
27
|
+
参数['section'] ||= []
|
28
|
+
参数['section'] << [args[1],args[2]] # 0:index 1:start 2:end
|
29
|
+
end
|
30
|
+
if line.include?('vpn-instance') and (args = line.split('vpn-instance ')[-1].split(' '))
|
31
|
+
参数['vpn-instance'] = args.first
|
32
|
+
end
|
33
|
+
if line.include?('dns-server') and (args = line.split('dns-server ')[-1].split(' '))
|
34
|
+
参数['dns-server'] = args
|
35
|
+
end
|
36
|
+
end
|
37
|
+
地址池列表 << 参数
|
38
|
+
end
|
39
|
+
地址池列表
|
40
|
+
end
|
41
|
+
|
42
|
+
def nat地址配置 配置散列
|
43
|
+
地址池列表 = [];参数 = {}
|
44
|
+
return 地址池列表 unless 配置散列['nat']
|
45
|
+
地址池配置 = 配置散列['nat'].select{|配置|配置.include?('nat instance ')}
|
46
|
+
地址池配置.each do|片段|
|
47
|
+
片段.each_line do|line|
|
48
|
+
if line.include?("nat instance")
|
49
|
+
地址池列表 << 参数 if 参数!={}
|
50
|
+
参数 = {}
|
51
|
+
参数['instance name'] = line.split("instance ")[1].split(" ")[0].strip
|
52
|
+
参数['instance id'] = line.split("instance ")[1].split("id ")[1].strip
|
53
|
+
end
|
54
|
+
参数['port-range'] = line.split("port-range")[1].strip if line.include?("port-range")
|
55
|
+
参数['instance group'] = line.split("service-instance-group")[1].strip if line.include?("service-instance-group")
|
56
|
+
if line.include?("nat address-group")
|
57
|
+
参数['address group'] ||= {}
|
58
|
+
参数['address group']['name'] = line.split("nat address-group ")[1].split(" ")[0].strip
|
59
|
+
参数['address group']['id'] = line.split("nat address-group ")[1].split("id ")[1].strip
|
60
|
+
end
|
61
|
+
if line.include?("section")
|
62
|
+
next if line.include?('lock')
|
63
|
+
参数['address group']['pool'] ||= []
|
64
|
+
if line.include?('mask') # section NUM NETWORK mask NETMASK
|
65
|
+
a,section,net,b,masknum = line.split(" ")
|
66
|
+
pool,mask = IP.v4("#{net}/#{masknum}")
|
67
|
+
参数['address group']['pool'] << [section,pool.to_d,mask.to_d]
|
68
|
+
elsif line.include?('exclude-ip-address') # section NUM exclude-ip-address START FINISH
|
69
|
+
a, session, exclude, exstart, exfinish = line.split(' ')
|
70
|
+
except_session = 参数['address group']['pool'].find{|s|s[0]==session}
|
71
|
+
next unless except_session
|
72
|
+
start, finish = except_session[1], except_session[2]
|
73
|
+
if IP.v4(finish).is_mask?
|
74
|
+
rstart, rfinish = IP.v4(start).range_with(IP.v4(finish))
|
75
|
+
new_ranges = sub_range([rstart.number-1, rfinish.number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
76
|
+
else
|
77
|
+
new_ranges = sub_range([IP.v4(start).number, IP.v4(finish).number], [IP.v4(exstart).number,IP.v4(exfinish).number])
|
78
|
+
end
|
79
|
+
new_ranges.each do|new_range|
|
80
|
+
# if empty, only delete old_range
|
81
|
+
参数['address group']['pool'] << [session, (IP.v4('0.0.0.0')+new_range[0]).to_d, (IP.v4('0.0.0.0')+new_range[1]).to_d]
|
82
|
+
end
|
83
|
+
参数['address group']['pool'].delete(except_session)
|
84
|
+
else # section NUM START FINISH
|
85
|
+
a, session, start, finish = line.split(' ')
|
86
|
+
参数['address group']['pool'] << [section,start,finish ]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
参数['address group']['outbound'] = line.split("outbound")[1].split(" ")[0] if line.include?("nat outbound")
|
90
|
+
end
|
91
|
+
|
92
|
+
地址池列表 << 参数
|
93
|
+
end
|
94
|
+
地址池列表
|
95
|
+
end
|
96
|
+
|
97
|
+
# 从一段地址范围中排除另一段地址范围 :=> 空,一段,两段地址范围
|
98
|
+
def sub_range old_range, exclude_range
|
99
|
+
a_start, a_end = old_range
|
100
|
+
b_start, b_end = exclude_range
|
101
|
+
result = []
|
102
|
+
if a_start < b_start
|
103
|
+
result << [a_start, [a_end, b_start - 1].min]
|
104
|
+
end
|
105
|
+
if a_end > b_end
|
106
|
+
result << [[b_end + 1, a_start].max, a_end]
|
107
|
+
end
|
108
|
+
result
|
109
|
+
end
|
110
|
+
|
111
|
+
def 地址池日志 详细信息
|
112
|
+
地址池列表 = [];时间标签 = Time.now.form
|
113
|
+
分片信息 = 详细信息.split("IP address pool Statistic")[0].to_s.split("-----------------------------------------------------------------------\n")[1..-1]
|
114
|
+
分片信息.each do|片段|单池 = {"Scan Time"=>时间标签}
|
115
|
+
单池['Pool Name'] = /Pool\-Name( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
116
|
+
单池['Pool No'] = /Pool\-No( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
117
|
+
单池['Pool Constant Index'] = /Pool\-constant\-index( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
118
|
+
单池['Position'] = /Position( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
119
|
+
单池['Status'] = /Status( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
120
|
+
单池['RUI Flag'] = /RUI\-Flag( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
121
|
+
单池['Gateway'] = /Gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
122
|
+
单池['Mask'] = /Mask( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
123
|
+
单池['Vpn Instance'] = /Vpn instance( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
124
|
+
单池['Unnumbered Gateway'] = /Unnumbered gateway( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
125
|
+
单池['Total'] = /Total( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
126
|
+
单池['Used'] = /Used( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
127
|
+
单池['Free'] = /Free( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
128
|
+
单池['Conflicted'] = /Conflicted( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
129
|
+
单池['Disable'] = /Disable( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
130
|
+
单池['Designated'] = /Designated( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip.split(" ")[0]
|
131
|
+
# NoNeed #单池['Gateway'] = /Gateway :(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
132
|
+
单池['Ratio'] = /Ratio( )*:(.+)/.match(片段).to_s.split(":")[1].to_s.strip
|
133
|
+
地址池列表 << 单池
|
134
|
+
end
|
135
|
+
地址池列表
|
136
|
+
end
|
137
|
+
end
|
138
|
+
```
|