From 984418065e576a77e0aafa67406b83897d583544 Mon Sep 17 00:00:00 2001 From: ixjx Date: Wed, 24 Mar 2021 12:47:01 +0800 Subject: [PATCH 1/4] fix _delimiter_left_list and ignore whether to change the password --- netdev/vendors/huawei/huawei.py | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/netdev/vendors/huawei/huawei.py b/netdev/vendors/huawei/huawei.py index bbe789f..0f1ee4b 100644 --- a/netdev/vendors/huawei/huawei.py +++ b/netdev/vendors/huawei/huawei.py @@ -1,13 +1,48 @@ from netdev.vendors.comware_like import ComwareLikeDevice import re +import asyncio +import asyncssh from netdev.logger import logger class Huawei(ComwareLikeDevice): """Class for working with Huawei""" + # system view or commit时会多出~,* + _delimiter_left_list = ["<", "[","[*","[~"] _disable_paging_command = "screen-length 0 temporary" """Command for disabling paging""" + async def _establish_connection(self): + """Establishing SSH connection to the network device""" + logger.info( + "Host {}: Establishing connection to port {}".format(self._host, self._port) + ) + output = "" + # initiate SSH connection + fut = asyncssh.connect(**self._connect_params_dict) + try: + self._conn = await asyncio.wait_for(fut, self._timeout) + except asyncssh.DisconnectError as e: + raise DisconnectError(self._host, e.code, e.reason) + except asyncio.TimeoutError: + raise TimeoutError(self._host) + self._stdin, self._stdout, self._stderr = await self._conn.open_session( + term_type="Dumb", term_size=(200, 24) + ) + logger.info("Host {}: Connection is established".format(self._host)) + # Flush unnecessary data + delimiters = map(re.escape, type(self)._delimiter_list) + delimiters = r"|".join(delimiters) + output = await self._read_until_pattern(delimiters) + logger.debug( + "Host {}: Establish Connection Output: {}".format(self._host, repr(output)) + ) + # When asked change password, choose N + if "The password needs to be changed. Change now? [Y/N]:" in output: + self._stdin.write(self._normalize_cmd("N\n")) + output = await self._read_until_pattern(delimiters) + return output + async def _set_base_prompt(self): """ Setting two important vars @@ -35,4 +70,5 @@ async def _set_base_prompt(self): ) logger.debug("Host {}: Base Prompt: {}".format(self._host, self._base_prompt)) logger.debug("Host {}: Base Pattern: {}".format(self._host, self._base_pattern)) - return self._base_prompt \ No newline at end of file + return self._base_prompt + \ No newline at end of file From 2bc3f6efe4420996847a3f8e5baf9d7d4f5b6d68 Mon Sep 17 00:00:00 2001 From: ixjx Date: Wed, 24 Mar 2021 20:13:04 +0800 Subject: [PATCH 2/4] import netdev.exception --- netdev/vendors/huawei/huawei.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netdev/vendors/huawei/huawei.py b/netdev/vendors/huawei/huawei.py index 0f1ee4b..e0c7241 100644 --- a/netdev/vendors/huawei/huawei.py +++ b/netdev/vendors/huawei/huawei.py @@ -2,6 +2,7 @@ import re import asyncio import asyncssh +from netdev.exceptions import TimeoutError, DisconnectError from netdev.logger import logger class Huawei(ComwareLikeDevice): From 4ca160622498fc434cd403a983ef28a392bbe5c4 Mon Sep 17 00:00:00 2001 From: ixjx Date: Wed, 28 Jul 2021 17:31:14 +0800 Subject: [PATCH 3/4] Update comware_like.py --- netdev/vendors/comware_like.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netdev/vendors/comware_like.py b/netdev/vendors/comware_like.py index bc83c2b..02993b7 100644 --- a/netdev/vendors/comware_like.py +++ b/netdev/vendors/comware_like.py @@ -57,7 +57,7 @@ async def _set_base_prompt(self): delimiter_right = r"|".join(delimiter_right) delimiter_left = map(re.escape, type(self)._delimiter_left_list) delimiter_left = r"|".join(delimiter_left) - base_prompt = re.escape(self._base_prompt[:12]) + base_prompt = re.escape(self._base_prompt) pattern = type(self)._pattern self._base_pattern = pattern.format( delimiter_left=delimiter_left, From cd30593c233c92e301cdaca97798ec71668ab78d Mon Sep 17 00:00:00 2001 From: ixjx Date: Wed, 28 Jul 2021 17:32:11 +0800 Subject: [PATCH 4/4] Update huawei.py fix _base_pattern[:12] --- netdev/vendors/huawei/huawei.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netdev/vendors/huawei/huawei.py b/netdev/vendors/huawei/huawei.py index e0c7241..918cee5 100644 --- a/netdev/vendors/huawei/huawei.py +++ b/netdev/vendors/huawei/huawei.py @@ -62,7 +62,7 @@ async def _set_base_prompt(self): delimiter_right = r"|".join(delimiter_right) delimiter_left = map(re.escape, type(self)._delimiter_left_list) delimiter_left = r"|".join(delimiter_left) - base_prompt = re.escape(self._base_prompt[:12]) + base_prompt = re.escape(self._base_prompt) pattern = type(self)._pattern self._base_pattern = pattern.format( delimiter_left=delimiter_left, @@ -72,4 +72,4 @@ async def _set_base_prompt(self): logger.debug("Host {}: Base Prompt: {}".format(self._host, self._base_prompt)) logger.debug("Host {}: Base Pattern: {}".format(self._host, self._base_pattern)) return self._base_prompt - \ No newline at end of file +