From 44fa8057c9c96c026056ce258b2481dd03e66a90 Mon Sep 17 00:00:00 2001 From: jathanism Date: Mon, 30 Sep 2013 17:30:51 -0700 Subject: [PATCH] Add SSH CLI support for F5 BIGIP load balancers --- conf/trigger_settings.py | 7 ++++++- trigger/__init__.py | 2 +- trigger/conf/global_settings.py | 7 ++++++- trigger/netdevices/__init__.py | 3 +++ trigger/twister.py | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/conf/trigger_settings.py b/conf/trigger_settings.py index d82a1ca..664e0fe 100644 --- a/conf/trigger_settings.py +++ b/conf/trigger_settings.py @@ -54,6 +54,7 @@ 'cisco', 'citrix', 'dell', + 'f5', 'force10', 'foundry', 'juniper', @@ -76,6 +77,7 @@ 'CISCO SYSTEMS': 'cisco', 'CITRIX': 'citrix', 'DELL': 'dell', + 'F5 NETWORKS': 'f5', 'FORCE10': 'force10', 'FOUNDRY': 'foundry', 'JUNIPER': 'juniper', @@ -92,6 +94,7 @@ 'cisco': ['ROUTER', 'SWITCH'], 'citrix': ['SWITCH'], # Assumed to be NetScalers 'dell': ['SWITCH'], + 'f5': ['LOAD BALANCING', 'SWITCH'], 'force10': ['ROUTER', 'SWITCH'], 'foundry': ['ROUTER', 'SWITCH'], 'juniper': ['FIREWALL', 'ROUTER', 'SWITCH'], # Any devices running Junos @@ -101,7 +104,7 @@ } # The tuple of support device types -SUPPORTED_TYPES = ('CONSOLE SERVER', 'FIREWALL', 'DWDM', 'LOAD BALANCER', +SUPPORTED_TYPES = ('CONSOLE SERVER', 'FIREWALL', 'DWDM', 'LOAD BALANCING', 'ROUTER', 'SWITCH') # A mapping of of vendor names to the default device type for each in the @@ -114,6 +117,7 @@ 'citrix': 'SWITCH', 'cisco': 'ROUTER', 'dell': 'SWITCH', + 'f5': 'LOAD BALANCING', 'force10': 'ROUTER', 'foundry': 'SWITCH', 'juniper': 'ROUTER', @@ -250,6 +254,7 @@ PROMPT_PATTERNS = { 'aruba': r'\(\S+\)(?: \(\S+\))?\s?#', 'citrix': r'\sDone\n$', + 'f5': r'(?:\S+\@)?\S+(?:\(.*\))\(tmos\)#\s{1,2}\r?$', 'juniper': r'\S+\@\S+(?:\>|#)\s$', 'mrv': r'\r\n?.*(?:\:\d{1})?\s\>\>?$', 'netscreen': r'(\w+?:|)[\w().-]*\(?([\w.-])?\)?\s*->\s*$', diff --git a/trigger/__init__.py b/trigger/__init__.py index 0d84da1..44224c6 100644 --- a/trigger/__init__.py +++ b/trigger/__init__.py @@ -1,4 +1,4 @@ -__version__ = (1, 4, 1, 'b1') +__version__ = (1, 4, 1, 'b2') full_version = '.'.join(map(str, __version__[0:3])) + ''.join(__version__[3:]) release = full_version diff --git a/trigger/conf/global_settings.py b/trigger/conf/global_settings.py index 8833e9d..20345aa 100644 --- a/trigger/conf/global_settings.py +++ b/trigger/conf/global_settings.py @@ -67,6 +67,7 @@ 'cisco', 'citrix', 'dell', + 'f5', 'force10', 'foundry', 'juniper', @@ -90,6 +91,7 @@ 'CISCO SYSTEMS': 'cisco', 'CITRIX': 'citrix', 'DELL': 'dell', + 'F5 NETWORKS': 'f5', 'FORCE10': 'force10', 'FOUNDRY': 'foundry', 'JUNIPER': 'juniper', @@ -107,6 +109,7 @@ 'cisco': ['ROUTER', 'SWITCH'], 'citrix': ['SWITCH'], # Assumed to be NetScalers 'dell': ['SWITCH'], + 'f5': ['LOAD BALANCING', 'SWITCH'], 'force10': ['ROUTER', 'SWITCH'], 'foundry': ['ROUTER', 'SWITCH'], 'juniper': ['FIREWALL', 'ROUTER', 'SWITCH'], # Any devices running Junos @@ -116,7 +119,8 @@ } # The tuple of support device types -SUPPORTED_TYPES = ('CONSOLE SERVER', 'FIREWALL', 'DWDM', 'LOAD BALANCER', 'ROUTER', 'SWITCH') +SUPPORTED_TYPES = ('CONSOLE SERVER', 'FIREWALL', 'DWDM', 'LOAD BALANCING', + 'ROUTER', 'SWITCH') # A mapping of of vendor names to the default device type for each in the # event that a device object is created and the deviceType attribute isn't set @@ -267,6 +271,7 @@ PROMPT_PATTERNS = { 'aruba': r'\(\S+\)(?: \(\S+\))?\s?#', 'citrix': r'\sDone\n$', + 'f5': r'(?:\S+\@)?\S+(?:\(.*\))\(tmos\)#\s{1,2}\r?$', 'juniper': r'\S+\@\S+(?:\>|#)\s$', 'mrv': r'\r\n?.*(?:\:\d{1})?\s\>\>?$', 'netscreen': r'(\w+?:|)[\w().-]*\(?([\w.-])?\)?\s*->\s*$', diff --git a/trigger/netdevices/__init__.py b/trigger/netdevices/__init__.py index 856197b..5b3e2f3 100644 --- a/trigger/netdevices/__init__.py +++ b/trigger/netdevices/__init__.py @@ -306,6 +306,7 @@ def disable_paging_brocade(): 'brocade': disable_paging_brocade(), # See comments above 'cisco': default, 'dell': ['terminal datadump\n'], + 'f5': ['modify cli preference pager disabled\n'], 'force10': default, 'foundry': ['skip-page-display\n'], 'juniper': ['set cli screen-length 0\n'], @@ -333,6 +334,8 @@ def _set_commit_commands(self): return ['commit'] elif self.vendor == 'mrv': return ['save configuration flash'] + elif self.vendor == 'f5': + return ['save sys config'] else: return [] diff --git a/trigger/twister.py b/trigger/twister.py index d6bf181..1397f68 100644 --- a/trigger/twister.py +++ b/trigger/twister.py @@ -75,7 +75,7 @@ def has_ioslike_error(s): tests = ( s.startswith('%'), # Cisco, Arista '\n%' in s, # A10, Aruba, Foundry - 'syntax error: ' in s, # Brocade VDX + 'syntax error: ' in s.lower(), # Brocade VDX, F5 BIGIP s.startswith('Invalid input -> '), # Brocade MLX s.endswith('Syntax Error'), # MRV )