def launch(self, cmd: str, **kwargs: Dict) -> None: if self.is_active(): raise SystemError("RPC is already active.") for key, module in LAUNCH_BACKENDS.items(): if cmd.lower().startswith(key): self.backend = module break self.process = self.backend.launch(cmd, **kwargs) # check that web3 can connect if not web3.provider: chain._network_disconnected() return uri = web3.provider.endpoint_uri if web3.provider else None for i in range(100): if web3.isConnected(): web3.reset_middlewares() self.backend.on_connection() chain._network_connected() return time.sleep(0.1) if isinstance(self.process, psutil.Popen): self.process.poll() if not self.process.is_running(): self.kill(False) raise RPCProcessError(cmd, uri) self.kill(False) raise RPCConnectionError(cmd, self.process, uri)
def launch(self, cmd: str, **kwargs: Dict) -> None: """Launches the RPC client. Args: cmd: command string to execute as subprocess""" if self.is_active(): raise SystemError("RPC is already active.") if sys.platform == "win32" and not cmd.split(" ")[0].endswith(".cmd"): if " " in cmd: cmd = cmd.replace(" ", ".cmd ", 1) else: cmd += ".cmd" cmd_list = cmd.split(" ") kwargs.setdefault("evm_version", EVM_DEFAULT) # type: ignore if kwargs["evm_version"] in EVM_EQUIVALENTS: kwargs["evm_version"] = EVM_EQUIVALENTS[ kwargs["evm_version"]] # type: ignore kwargs = _validate_cmd_settings(kwargs) for key, value in [(k, v) for k, v in kwargs.items() if v]: if key == "unlock": if not isinstance(value, list): value = [value] # type: ignore for address in value: if isinstance(address, int): address = HexBytes(address.to_bytes(20, "big")).hex() cmd_list.extend([CLI_FLAGS[key], address]) else: try: cmd_list.extend([CLI_FLAGS[key], str(value)]) except KeyError: warnings.warn( f"Ignoring invalid commandline setting for ganache-cli: " f'"{key}" with value "{value}".', InvalidArgumentWarning, ) print(f"\nLaunching '{' '.join(cmd_list)}'...") out = DEVNULL if sys.platform == "win32" else PIPE self._rpc = psutil.Popen(cmd_list, stdin=DEVNULL, stdout=out, stderr=out) # check that web3 can connect if not web3.provider: chain._network_disconnected() return uri = web3.provider.endpoint_uri if web3.provider else None for i in range(100): if web3.isConnected(): chain._network_connected() return time.sleep(0.1) if type(self._rpc) is psutil.Popen: self._rpc.poll() if not self._rpc.is_running(): self.kill(False) raise RPCProcessError(cmd, uri) self.kill(False) raise RPCConnectionError(cmd, self._rpc, uri)
def launch(self, cmd: str, **kwargs: Dict) -> None: """Launches the RPC client. Args: cmd: command string to execute as subprocess""" if self.is_active(): raise SystemError("RPC is already active.") if sys.platform == "win32" and not cmd.split(" ")[0].endswith(".cmd"): if " " in cmd: cmd = cmd.replace(" ", ".cmd ", 1) else: cmd += ".cmd" cmd_list = cmd.split(" ") kwargs.setdefault("evm_version", EVM_DEFAULT) # type: ignore if kwargs["evm_version"] in EVM_EQUIVALENTS: kwargs["evm_version"] = EVM_EQUIVALENTS[kwargs["evm_version"]] # type: ignore kwargs = _validate_cmd_settings(kwargs) for key, value in [(k, v) for k, v in kwargs.items() if v]: try: cmd_list.extend([CLI_FLAGS[key], str(value)]) except KeyError: warnings.warn( f"Ignoring invalid commandline setting for ganache-cli: " f'"{key}" with value "{value}".', InvalidArgumentWarning, ) print(f"Launching '{' '.join(cmd_list)}'...") self._time_offset = 0 self._snapshot_id = False self._reset_id = False out = DEVNULL if sys.platform == "win32" else PIPE self._rpc = psutil.Popen(cmd_list, stdin=DEVNULL, stdout=out, stderr=out) # check that web3 can connect if not web3.provider: _notify_registry(0) return uri = web3.provider.endpoint_uri if web3.provider else None for i in range(100): if web3.isConnected(): self._reset_id = self._current_id = self._snap() _notify_registry(0) self._time_offset = self._request("evm_increaseTime", [0]) return time.sleep(0.1) if type(self._rpc) is psutil.Popen: self._rpc.poll() if not self._rpc.is_running(): self.kill(False) raise RPCProcessError(cmd, uri) self.kill(False) raise RPCConnectionError(cmd, self._rpc, uri)
def launch(self, cmd: str, **kwargs: Dict) -> None: """Launches the RPC client. Args: cmd: command string to execute as subprocess""" if self.is_active(): raise SystemError("RPC is already active.") if sys.platform == "win32" and not cmd.split(" ")[0].endswith(".cmd"): if " " in cmd: cmd = cmd.replace(" ", ".cmd ", 1) else: cmd += ".cmd" kwargs.setdefault("evm_version", EVM_DEFAULT) # type: ignore if kwargs["evm_version"] in EVM_EQUIVALENTS: kwargs["evm_version"] = EVM_EQUIVALENTS[ kwargs["evm_version"]] # type: ignore for key, value in [(k, v) for k, v in kwargs.items() if v]: cmd += f" {CLI_FLAGS[key]} {value}" print(f"Launching '{cmd}'...") self._time_offset = 0 self._snapshot_id = False self._reset_id = False out = DEVNULL if sys.platform == "win32" else PIPE self._rpc = psutil.Popen(cmd.split(" "), stdin=DEVNULL, stdout=out, stderr=out) # check that web3 can connect if not web3.provider: _notify_registry(0) return uri = web3.provider.endpoint_uri if web3.provider else None for i in range(100): if web3.isConnected(): self._reset_id = self._current_id = self._snap() _notify_registry(0) return time.sleep(0.1) if type(self._rpc) is psutil.Popen: self._rpc.poll() if not self._rpc.is_running(): self.kill(False) raise RPCProcessError(cmd, uri) self.kill(False) raise RPCConnectionError(cmd, self._rpc, uri)
def launch(self, cmd): '''Launches the RPC client. Args: cmd: command string to execute as subprocess''' if self.is_active(): raise SystemError("RPC is already active.") try: self._rpc = psutil.Popen(cmd.split(" "), stdin=DEVNULL, stdout=PIPE, stderr=PIPE, bufsize=1) except FileNotFoundError: if sys.platform == "win32" and cmd.split(" ")[0][-4:] != ".cmd": if " " in cmd: cmd = cmd.replace(" ", ".cmd ", 1) else: cmd += ".cmd" return self.launch(cmd) raise print(f"Launching '{cmd}'...") self._time_offset = 0 self._snapshot_id = False self._reset_id = False uri = web3.providers[0].endpoint_uri if web3.providers else None # check if process loads successfully self._rpc.stdout.peek() time.sleep(0.1) if self._rpc.poll(): raise RPCProcessError(cmd, self._rpc, uri) # check that web3 can connect if not web3.providers: self._reset() return for i in range(50): time.sleep(0.05) if web3.isConnected(): self._reset_id = self._snap() self._reset() return rpc = self._rpc self.kill(False) raise RPCConnectionError(cmd, rpc, uri)