self.lock_config() try: self.config.rollback(identifier) except ValueError: exc = get_exception() self.raise_exc('Unable to rollback config: $s' % str(exc)) diff = self.config.diff() if commit: self.commit_config(comment=comment) self.unlock_config() return diff Netconf = register_transport('netconf')(Netconf) class Cli(CliBase): CLI_PROMPTS_RE = [ re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") ] CLI_ERRORS_RE = [ re.compile(r"unkown command") ] def connect(self, params, **kwargs): super(Cli, self).connect(params, **kwargs)
def _jsonify(self, data): for encoding in ("utf-8", "latin-1"): try: return json.dumps(data, encoding=encoding) # Old systems using old simplejson module does not support encoding keyword. except TypeError: try: new_data = json_dict_bytes_to_unicode(data, encoding=encoding) except UnicodeDecodeError: continue return json.dumps(new_data) except UnicodeDecodeError: continue self._error(msg='Invalid unicode encoding encountered') Nxapi = register_transport('nxapi')(Nxapi) class Cli(CliBase): CLI_PROMPTS_RE = [ re.compile(r'[\r\n]?[a-zA-Z]{1}[a-zA-Z0-9-]*[>|#|%](?:\s*)$'), re.compile(r'[\r\n]?[a-zA-Z]{1}[a-zA-Z0-9-]*\(.+\)#(?:\s*)$') ] CLI_ERRORS_RE = [ re.compile(r"% ?Error"), re.compile(r"^% \w+", re.M), re.compile(r"% ?Bad secret"), re.compile(r"invalid input", re.I), re.compile(r"(?:incomplete|ambiguous) command", re.I),
for index, cmd in enumerate(commands): if cmd.output == 'text': responses[index] = responses[index].get('output') return responses ### Config methods ### def get_config(self, include_defaults=False): cmd = 'show running-config' if include_defaults: cmd += ' all' return self.execute([cmd], output='text')[0]['output'] Eapi = register_transport('eapi')(Eapi) class Cli(EosConfigMixin, CliBase): CLI_PROMPTS_RE = [ re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") ] CLI_ERRORS_RE = [ re.compile(r"% ?Error"), re.compile(r"^% \w+", re.M), re.compile(r"% ?Bad secret"), re.compile(r"invalid input", re.I), re.compile(r"(?:incomplete|ambiguous) command", re.I),
cmds.extend(to_list(commands)) cmds.append('end') cmds.append('commit') responses = self.execute(cmds) responses.pop(0) return responses def get_config(self, **kwargs): return self.execute(['show running-configuration']) def load_config(self, commands, **kwargs): return self.configure(commands) def commit_config(self, **kwargs): self.execute(['commit']) def abort_config(self, **kwargs): self.execute(['discard']) def save_config(self): self.execute(['copy running-config startup-config']) Cli = register_transport('cli', default=True)(Cli)
# Found on 11.6.1 re.compile(r"[\w-]+\@\([\w\-\.]+\)"), ] CLI_ERRORS_RE = [ re.compile(r"connection timed out", re.I), re.compile(r"syntax error: unexpected argument", re.I) ] NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I) def connect(self, params, **kwargs): super(Cli, self).connect(params, kickstart=False, **kwargs) Cli = register_transport('cli', default=True)(Cli) from ansible.module_utils.basic import * from ansible.module_utils.f5 import * from ansible.module_utils.basic import get_exception from ansible.module_utils.network import NetworkModule, NetworkError from ansible.module_utils.netcli import CommandRunner from ansible.module_utils.netcli import AddCommandError, FailedConditionsError from ansible.module_utils.netcli import FailedConditionalError, AddConditionError from ansible.module_utils.six import string_types VALID_KEYS = ['command', 'output', 'prompt', 'response']
try: self.config.rollback(identifier) except ValueError: exc = get_exception() self.raise_exc('Unable to rollback config: $s' % str(exc)) diff = self.config.diff() if commit: self.commit_config(comment=comment) self.unlock_config() return diff Netconf = register_transport('netconf')(Netconf) class Cli(CliBase): CLI_PROMPTS_RE = [ re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") ] CLI_ERRORS_RE = [re.compile(r"unkown command")] def connect(self, params, **kwargs): super(Cli, self).connect(params, **kwargs) if self.shell._matched_prompt.strip().endswith('%'): self.execute('cli')
try: return json.dumps(data, encoding=encoding) # Old systems using old simplejson module does not support encoding keyword. except TypeError: try: new_data = json_dict_bytes_to_unicode(data, encoding=encoding) except UnicodeDecodeError: continue return json.dumps(new_data) except UnicodeDecodeError: continue self._error(msg='Invalid unicode encoding encountered') Rest = register_transport('rest')(Rest) class Cli(NetCli): CLI_PROMPTS_RE = None CLI_ERRORS_RE = None NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I) def configure(self, commands, **kwargs): cmds = ['configure terminal'] cmds.extend(to_list(commands)) responses = self.execute(cmds) return responses[1:]
def _jsonify(self, data): for encoding in ("utf-8", "latin-1"): try: return json.dumps(data, encoding=encoding) # Old systems using old simplejson module does not support encoding keyword. except TypeError: try: new_data = json_dict_bytes_to_unicode(data, encoding=encoding) except UnicodeDecodeError: continue return json.dumps(new_data) except UnicodeDecodeError: continue self._error(msg='Invalid unicode encoding encountered') Rest = register_transport('rest')(Rest) class Cli(CliBase): CLI_PROMPTS_RE = [ re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") ] CLI_ERRORS_RE = [ re.compile(r"% ?Error"), re.compile(r"% ?Bad secret"), re.compile(r"invalid input", re.I), re.compile(r"(?:incomplete|ambiguous) command", re.I), re.compile(r"connection timed out", re.I),
(ex.message)) #print "failed to connect to %s" % (self.host) raise Exception(ex.message) def logoff(self, module): self.host = module.params['host'] if self.enable_debug: print "\n***** LOGOFF *****" conn = httplib.HTTPConnection(self.host) #conn.request("POST", self.LOGOFF_URI, "", self.headers) conn.request("GET", self.urllogoff, "", headers=self.headers) self._connected = False response = conn.getresponse().read() return response def axapi_enabled_disabled(self, flag): ''' The axapi uses 0/1 integer values for flags, rather than strings or booleans, so convert the given flag to a 0 or 1. For now, params are specified as strings only so thats what we check. ''' if flag == 'enabled': return 1 else: return 0 XAPI = register_transport('axapi')(XAPI)
responses = self.execute(cmds) return responses[1:] def get_config(self, include_defaults=False, **kwargs): cmd = 'show running-config' if include_defaults: cmd += ' all' return self.run_commands(cmd)[0] def load_config(self, commands, **kwargs): return self.configure(commands) def save_config(self): self.execute(['copy running-config startup-config']) Cli = register_transport('cli', default=True)(Cli) class Restconf(object): DEFAULT_HEADERS = { 'Content-Type': 'application/json', 'Accept': 'application/json' } def __init__(self): self.url = None self.url_args = ModuleStub(url_argument_spec(), self._error) self.token = None
def _jsonify(self, data): for encoding in ("utf-8", "latin-1"): try: return json.dumps(data, encoding=encoding) # Old systems using old simplejson module does not support encoding keyword. except TypeError: try: new_data = json_dict_bytes_to_unicode(data, encoding=encoding) except UnicodeDecodeError: continue return json.dumps(new_data) except UnicodeDecodeError: continue self._error(msg='Invalid unicode encoding encountered') Rest = register_transport('rest')(Rest) class Cli(NetCli): CLI_PROMPTS_RE = None CLI_ERRORS_RE = None NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I) def configure(self, commands, **kwargs): cmds = ['configure terminal'] cmds.extend(to_list(commands)) responses = self.execute(cmds) return responses[1:]
return responses[1:] def get_config(self, include_defaults=False, **kwargs): cmd = 'show running-config' if include_defaults: cmd += ' all' return self.run_commands(cmd)[0] def load_config(self, commands, **kwargs): return self.configure(commands) def save_config(self): self.execute(['copy running-config startup-config']) Cli = register_transport('cli', default=True)(Cli) class Restconf(object): DEFAULT_HEADERS = { 'Content-Type': 'application/json', 'Accept': 'application/json' } def __init__(self): self.url = None self.url_args = ModuleStub(url_argument_spec(), self._error) self.token = None
def _jsonify(self, data): for encoding in ("utf-8", "latin-1"): try: return json.dumps(data, encoding=encoding) # Old systems using old simplejson module does not support encoding keyword. except TypeError: try: new_data = json_dict_bytes_to_unicode(data, encoding=encoding) except UnicodeDecodeError: continue return json.dumps(new_data) except UnicodeDecodeError: continue self._error(msg='Invalid unicode encoding encountered') Rest = register_transport('rest')(Rest) class Cli(CliBase): CLI_PROMPTS_RE = [ re.compile(r"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), re.compile(r"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") ] CLI_ERRORS_RE = [ re.compile(r"(?:unknown|incomplete|ambiguous) command", re.I), ] NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I)