15
15
16
16
from netman .adapters .shell .ssh import SshClient
17
17
from netman .adapters .shell .telnet import TelnetClient
18
- from netman .core .objects .interface_states import OFF , ON
18
+ from netman .core .objects .interface_states import OFF
19
19
from netman .core .objects .port_modes import TRUNK
20
20
from netman .core .objects .port_modes import ACCESS
21
21
from netman .core .objects .interface import Interface
22
22
from netman .adapters .switches .cisco import parse_vlan_ranges
23
23
from netman .core .objects .vlan import Vlan
24
24
from netman import regex
25
25
from netman .core .objects .switch_transactional import FlowControlSwitch
26
- from netman .adapters .switches .util import SubShell , no_output , ResultChecker
26
+ from netman .adapters .switches .util import SubShell , no_output , ResultChecker , PageReader
27
27
from netman .core .objects .exceptions import UnknownInterface , BadVlanName , \
28
28
BadVlanNumber , UnknownVlan , InterfaceInWrongPortMode , NativeVlanNotSet , TrunkVlanNotSet , BadInterfaceDescription , \
29
29
VlanAlreadyExist , UnknownBond , InvalidMtuSize , InterfaceResetIncomplete
@@ -55,6 +55,12 @@ def __init__(self, switch_descriptor, shell_factory):
55
55
self .shell = None
56
56
self .shell_factory = shell_factory
57
57
58
+ self .page_reader = PageReader (
59
+ read_while = "--More-- or (q)uit" ,
60
+ and_press = "m" ,
61
+ unless_prompt = "#"
62
+ )
63
+
58
64
def _connect (self ):
59
65
params = dict (
60
66
host = self .switch_descriptor .hostname ,
@@ -92,17 +98,13 @@ def set_interface_state(self, interface_id, state):
92
98
self .shell .do ('shutdown' if state is OFF else 'no shutdown' )
93
99
94
100
def get_vlans (self ):
95
- result = self .shell .do ('show vlan' , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
96
- while len (result ) > 0 and "--More--" in result [- 1 ]:
97
- result += self .shell .send_key ("m" , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
98
-
101
+ result = self .page_reader .do (self .shell , "show vlan" )
99
102
vlans = parse_vlan_list (result )
100
103
return vlans
101
104
102
105
def get_vlan (self , vlan_number ):
103
- result = self .shell .do ("show vlan id {}" .format (vlan_number ), wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
104
- while len (result ) > 0 and "--More--" in result [- 1 ]:
105
- result += self .shell .send_key ("m" , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
106
+ result = self .page_reader .do (self .shell , "show vlan id {}" .format (vlan_number ))
107
+
106
108
if regex .match (".*\^.*" , result [0 ]):
107
109
raise BadVlanNumber ()
108
110
elif regex .match ("^ERROR" , result [0 ]):
@@ -111,9 +113,8 @@ def get_vlan(self, vlan_number):
111
113
return vlan
112
114
113
115
def get_vlan_interfaces (self , vlan_number ):
114
- result = self .shell .do ("show vlan id {}" .format (vlan_number ), wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
115
- while len (result ) > 0 and "--More--" in result [- 1 ]:
116
- result += self .shell .send_key ("m" , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
116
+ result = self .page_reader .do (self .shell , "show vlan id {}" .format (vlan_number ))
117
+
117
118
if regex .match (".*\^.*" , result [0 ]):
118
119
raise BadVlanNumber ()
119
120
elif regex .match ("^ERROR" , result [0 ]):
@@ -125,17 +126,12 @@ def get_interface(self, interface_id):
125
126
return self .read_interface (interface_id )
126
127
127
128
def get_interfaces (self ):
128
- result = self .shell .do ('show interfaces status' , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
129
- name_list = self .parse_interface_names (result )
130
-
131
- while len (result ) > 0 and "--More--" in result [- 1 ]:
132
- result = self .shell .send_key ("m" , wait_for = ("--More-- or (q)uit" , "#" ), include_last_line = True )
133
- name_list += self .parse_interface_names (result )
129
+ result = self .page_reader .do (self .shell , 'show interfaces status' )
134
130
135
- return [self .read_interface (name ) for name in name_list ]
131
+ return [self .read_interface (name ) for name in self . parse_interface_names ( result ) ]
136
132
137
133
def add_vlan (self , number , name = None ):
138
- result = self .shell .do ("show vlan id {}" .format (number ))
134
+ result = self .page_reader .do (self . shell , "show vlan id {}" .format (number ))
139
135
if regex .match (".*\^.*" , result [0 ]):
140
136
raise BadVlanNumber ()
141
137
elif regex .match ("^VLAN" , result [0 ]):
@@ -306,7 +302,7 @@ def set(self, command, *arguments):
306
302
return ResultChecker (result )
307
303
308
304
def get_interface_data (self , interface_id ):
309
- interface_data = self .shell .do ("show running-config interface {}" .format (interface_id ))
305
+ interface_data = self .page_reader .do (self . shell , "show running-config interface {}" .format (interface_id ))
310
306
if any (["Invalid input" in line or regex .match ("ERROR.*" , line ) for line in interface_data ]):
311
307
raise UnknownInterface (interface_id )
312
308
return interface_data
0 commit comments