renamed utils.check_cmd to utils.cmd, updated host_cmd to allow for shell commands for output redirection
This commit is contained in:
		
							parent
							
								
									16b7e70c33
								
							
						
					
					
						commit
						78f981463d
					
				
					 15 changed files with 34 additions and 31 deletions
				
			
		|  | @ -878,7 +878,7 @@ class CoreHandler(socketserver.BaseRequestHandler): | |||
|                 ): | ||||
|                     if message.flags & MessageFlags.LOCAL.value: | ||||
|                         try: | ||||
|                             res = utils.check_cmd(command) | ||||
|                             res = utils.cmd(command) | ||||
|                             status = 0 | ||||
|                         except CoreCommandError as e: | ||||
|                             res = e.stderr | ||||
|  |  | |||
|  | @ -140,7 +140,7 @@ class EmaneManager(ModelManager): | |||
|         try: | ||||
|             # check for emane | ||||
|             args = "emane --version" | ||||
|             emane_version = utils.check_cmd(args) | ||||
|             emane_version = utils.cmd(args) | ||||
|             logging.info("using EMANE: %s", emane_version) | ||||
|             self.session.distributed.execute(lambda x: x.remote_cmd(args)) | ||||
| 
 | ||||
|  | @ -594,7 +594,7 @@ class EmaneManager(ModelManager): | |||
|         log_file = os.path.join(path, "emane.log") | ||||
|         platform_xml = os.path.join(path, "platform.xml") | ||||
|         emanecmd += f" -f {log_file} {platform_xml}" | ||||
|         utils.check_cmd(emanecmd, cwd=path) | ||||
|         utils.cmd(emanecmd, cwd=path) | ||||
|         self.session.distributed.execute(lambda x: x.remote_cmd(emanecmd, cwd=path)) | ||||
|         logging.info("host emane daemon running: %s", emanecmd) | ||||
| 
 | ||||
|  | @ -618,8 +618,8 @@ class EmaneManager(ModelManager): | |||
| 
 | ||||
|         if stop_emane_on_host: | ||||
|             try: | ||||
|                 utils.check_cmd(kill_emaned) | ||||
|                 utils.check_cmd(kill_transortd) | ||||
|                 utils.cmd(kill_emaned) | ||||
|                 utils.cmd(kill_transortd) | ||||
|                 self.session.distributed.execute(lambda x: x.remote_cmd(kill_emaned)) | ||||
|                 self.session.distributed.execute(lambda x: x.remote_cmd(kill_transortd)) | ||||
|             except CoreCommandError: | ||||
|  |  | |||
|  | @ -63,4 +63,4 @@ class EmaneTdmaModel(emanemodel.EmaneModel): | |||
|             "setting up tdma schedule: schedule(%s) device(%s)", schedule, event_device | ||||
|         ) | ||||
|         args = f"emaneevent-tdmaschedule -i {event_device} {schedule}" | ||||
|         utils.check_cmd(args) | ||||
|         utils.cmd(args) | ||||
|  |  | |||
|  | @ -1187,6 +1187,6 @@ class Ns2ScriptedMobility(WayPointMobility): | |||
|             return | ||||
|         filename = self.findfile(filename) | ||||
|         args = f"/bin/sh {filename} {typestr}" | ||||
|         utils.check_cmd( | ||||
|         utils.cmd( | ||||
|             args, cwd=self.session.session_dir, env=self.session.get_environment() | ||||
|         ) | ||||
|  |  | |||
|  | @ -79,7 +79,7 @@ class NodeBase(object): | |||
|         """ | ||||
|         raise NotImplementedError | ||||
| 
 | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True): | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True, shell=False): | ||||
|         """ | ||||
|         Runs a command on the host system or distributed server. | ||||
| 
 | ||||
|  | @ -87,12 +87,13 @@ class NodeBase(object): | |||
|         :param dict env: environment to run command with | ||||
|         :param str cwd: directory to run command in | ||||
|         :param bool wait: True to wait for status, False otherwise | ||||
|         :param bool shell: True to use shell, False otherwise | ||||
|         :return: combined stdout and stderr | ||||
|         :rtype: str | ||||
|         :raises CoreCommandError: when a non-zero exit status occurs | ||||
|         """ | ||||
|         if self.server is None: | ||||
|             return utils.check_cmd(args, env, cwd, wait) | ||||
|             return utils.cmd(args, env, cwd, wait, shell) | ||||
|         else: | ||||
|             return self.server.remote_cmd(args, env, cwd, wait) | ||||
| 
 | ||||
|  |  | |||
|  | @ -65,4 +65,4 @@ class VnodeClient(object): | |||
|         """ | ||||
|         self._verify_connection() | ||||
|         args = self.create_cmd(args) | ||||
|         return utils.check_cmd(args, wait=wait) | ||||
|         return utils.cmd(args, wait=wait) | ||||
|  |  | |||
|  | @ -45,14 +45,14 @@ class DockerClient(object): | |||
| 
 | ||||
|     def check_cmd(self, cmd): | ||||
|         logging.info("docker cmd output: %s", cmd) | ||||
|         return utils.check_cmd(f"docker exec {self.name} {cmd}") | ||||
|         return utils.cmd(f"docker exec {self.name} {cmd}") | ||||
| 
 | ||||
|     def create_ns_cmd(self, cmd): | ||||
|         return f"nsenter -t {self.pid} -u -i -p -n {cmd}" | ||||
| 
 | ||||
|     def ns_cmd(self, cmd, wait): | ||||
|         args = f"nsenter -t {self.pid} -u -i -p -n {cmd}" | ||||
|         return utils.check_cmd(args, wait=wait) | ||||
|         return utils.cmd(args, wait=wait) | ||||
| 
 | ||||
|     def get_pid(self): | ||||
|         args = f"docker inspect -f '{{{{.State.Pid}}}}' {self.name}" | ||||
|  | @ -153,7 +153,7 @@ class DockerNode(CoreNode): | |||
|     def nsenter_cmd(self, args, wait=True): | ||||
|         if self.server is None: | ||||
|             args = self.client.create_ns_cmd(args) | ||||
|             return utils.check_cmd(args, wait=wait) | ||||
|             return utils.cmd(args, wait=wait) | ||||
|         else: | ||||
|             args = self.client.create_ns_cmd(args) | ||||
|             return self.server.remote_cmd(args, wait=wait) | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ class CoreInterface(object): | |||
|         use_ovs = session.options.get_config("ovs") == "True" | ||||
|         self.net_client = get_net_client(use_ovs, self.host_cmd) | ||||
| 
 | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True): | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True, shell=False): | ||||
|         """ | ||||
|         Runs a command on the host system or distributed server. | ||||
| 
 | ||||
|  | @ -56,12 +56,13 @@ class CoreInterface(object): | |||
|         :param dict env: environment to run command with | ||||
|         :param str cwd: directory to run command in | ||||
|         :param bool wait: True to wait for status, False otherwise | ||||
|         :param bool shell: True to use shell, False otherwise | ||||
|         :return: combined stdout and stderr | ||||
|         :rtype: str | ||||
|         :raises CoreCommandError: when a non-zero exit status occurs | ||||
|         """ | ||||
|         if self.server is None: | ||||
|             return utils.check_cmd(args, env, cwd, wait) | ||||
|             return utils.cmd(args, env, cwd, wait, shell) | ||||
|         else: | ||||
|             return self.server.remote_cmd(args, env, cwd, wait) | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ class LxdClient(object): | |||
| 
 | ||||
|     def check_cmd(self, cmd, wait=True): | ||||
|         args = self.create_cmd(cmd) | ||||
|         return utils.check_cmd(args, wait=wait) | ||||
|         return utils.cmd(args, wait=wait) | ||||
| 
 | ||||
|     def copy_file(self, source, destination): | ||||
|         if destination[0] != "/": | ||||
|  |  | |||
|  | @ -2,8 +2,6 @@ | |||
| Clients for dealing with bridge/interface commands. | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| 
 | ||||
| from core.constants import BRCTL_BIN, ETHTOOL_BIN, IP_BIN, OVS_BIN, TC_BIN | ||||
| 
 | ||||
| 
 | ||||
|  | @ -236,10 +234,10 @@ class LinuxNetClient(object): | |||
|         self.device_up(name) | ||||
| 
 | ||||
|         # turn off multicast snooping so forwarding occurs w/o IGMP joins | ||||
|         snoop = f"/sys/devices/virtual/net/{name}/bridge/multicast_snooping" | ||||
|         if os.path.exists(snoop): | ||||
|             with open(snoop, "w") as f: | ||||
|                 f.write("0") | ||||
|         snoop_file = "multicast_snooping" | ||||
|         snoop = f"/sys/devices/virtual/net/{name}/bridge/{snoop_file}" | ||||
|         self.run(f"echo 0 > /tmp/{snoop_file}", shell=True) | ||||
|         self.run(f"cp /tmp/{snoop_file} {snoop}") | ||||
| 
 | ||||
|     def delete_bridge(self, name): | ||||
|         """ | ||||
|  |  | |||
|  | @ -270,7 +270,7 @@ class CoreNetwork(CoreNetworkBase): | |||
|             self.startup() | ||||
|             ebq.startupdateloop(self) | ||||
| 
 | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True): | ||||
|     def host_cmd(self, args, env=None, cwd=None, wait=True, shell=False): | ||||
|         """ | ||||
|         Runs a command that is used to configure and setup the network on the host | ||||
|         system and all configured distributed servers. | ||||
|  | @ -279,12 +279,13 @@ class CoreNetwork(CoreNetworkBase): | |||
|         :param dict env: environment to run command with | ||||
|         :param str cwd: directory to run command in | ||||
|         :param bool wait: True to wait for status, False otherwise | ||||
|         :param bool shell: True to use shell, False otherwise | ||||
|         :return: combined stdout and stderr | ||||
|         :rtype: str | ||||
|         :raises CoreCommandError: when a non-zero exit status occurs | ||||
|         """ | ||||
|         logging.info("network node(%s) cmd", self.name) | ||||
|         output = utils.check_cmd(args, env, cwd, wait) | ||||
|         output = utils.cmd(args, env, cwd, wait, shell) | ||||
|         self.session.distributed.execute(lambda x: x.remote_cmd(args, env, cwd, wait)) | ||||
|         return output | ||||
| 
 | ||||
|  | @ -765,7 +766,7 @@ class CtrlNet(CoreNetwork): | |||
|         """ | ||||
|         use_ovs = self.session.options.get_config("ovs") == "True" | ||||
|         current = f"{address}/{self.prefix.prefixlen}" | ||||
|         net_client = get_net_client(use_ovs, utils.check_cmd) | ||||
|         net_client = get_net_client(use_ovs, utils.cmd) | ||||
|         net_client.create_address(self.brname, current) | ||||
|         servers = self.session.distributed.servers | ||||
|         for name in servers: | ||||
|  |  | |||
|  | @ -415,7 +415,7 @@ class HttpService(UtilService): | |||
|         Detect the apache2 version using the 'a2query' command. | ||||
|         """ | ||||
|         try: | ||||
|             result = utils.check_cmd("a2query -v") | ||||
|             result = utils.cmd("a2query -v") | ||||
|             status = 0 | ||||
|         except CoreCommandError as e: | ||||
|             status = e.returncode | ||||
|  |  | |||
|  | @ -191,7 +191,7 @@ def mute_detach(args, **kwargs): | |||
|     return Popen(args, **kwargs).pid | ||||
| 
 | ||||
| 
 | ||||
| def check_cmd(args, env=None, cwd=None, wait=True): | ||||
| def cmd(args, env=None, cwd=None, wait=True, shell=False): | ||||
|     """ | ||||
|     Execute a command on the host and return a tuple containing the exit status and | ||||
|     result string. stderr output is folded into the stdout result string. | ||||
|  | @ -200,15 +200,17 @@ def check_cmd(args, env=None, cwd=None, wait=True): | |||
|     :param dict env: environment to run command with | ||||
|     :param str cwd: directory to run command in | ||||
|     :param bool wait: True to wait for status, False otherwise | ||||
|     :param bool shell: True to use shell, False otherwise | ||||
|     :return: combined stdout and stderr | ||||
|     :rtype: str | ||||
|     :raises CoreCommandError: when there is a non-zero exit status or the file to | ||||
|         execute is not found | ||||
|     """ | ||||
|     logging.info("command cwd(%s) wait(%s): %s", cwd, wait, args) | ||||
|     args = shlex.split(args) | ||||
|     if shell is False: | ||||
|         args = shlex.split(args) | ||||
|     try: | ||||
|         p = Popen(args, stdout=PIPE, stderr=PIPE, env=env, cwd=cwd) | ||||
|         p = Popen(args, stdout=PIPE, stderr=PIPE, env=env, cwd=cwd, shell=shell) | ||||
|         if wait: | ||||
|             stdout, stderr = p.communicate() | ||||
|             status = p.wait() | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ def get_ipv4_addresses(hostname): | |||
|     if hostname == "localhost": | ||||
|         addresses = [] | ||||
|         args = f"{IP_BIN} -o -f inet address show" | ||||
|         output = utils.check_cmd(args) | ||||
|         output = utils.cmd(args) | ||||
|         for line in output.split(os.linesep): | ||||
|             split = line.split() | ||||
|             if not split: | ||||
|  |  | |||
|  | @ -67,4 +67,4 @@ class TestNodes: | |||
|         # then | ||||
|         assert node | ||||
|         assert node.up | ||||
|         assert utils.check_cmd(f"brctl show {node.brname}") | ||||
|         assert utils.cmd(f"brctl show {node.brname}") | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue