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, diff --git a/netdev/vendors/huawei/huawei.py b/netdev/vendors/huawei/huawei.py index bbe789f..918cee5 100644 --- a/netdev/vendors/huawei/huawei.py +++ b/netdev/vendors/huawei/huawei.py @@ -1,13 +1,49 @@ from netdev.vendors.comware_like import ComwareLikeDevice import re +import asyncio +import asyncssh +from netdev.exceptions import TimeoutError, DisconnectError 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 @@ -26,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, @@ -35,4 +71,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 +