Implement a wrapper for dom0 -> dom0 qrexec calls
Qrexec itself does not support loopback calls. Since a call into dom0 is a common case for GUIVM (which may be dom0) to do, add a convenient handling inside vm.run_service() function. Fixes QubesOS/qubes-issues#5140
This commit is contained in:
		
							parent
							
								
									02cfab8257
								
							
						
					
					
						commit
						1d1289619c
					
				| @ -22,6 +22,7 @@ | ||||
| """ | ||||
| Main Qubes() class and related classes. | ||||
| """ | ||||
| import grp | ||||
| import os | ||||
| import shlex | ||||
| import socket | ||||
| @ -699,6 +700,37 @@ class QubesLocal(QubesBase): | ||||
|         elif not self.domains.get_blind(dest).is_running(): | ||||
|             raise qubesadmin.exc.QubesVMNotRunningError( | ||||
|                 '%s is not running', dest) | ||||
|         if dest == 'dom0': | ||||
|             # can't make real dom0->dom0 call | ||||
|             if filter_esc: | ||||
|                 raise NotImplementedError( | ||||
|                     'filter_esc=True not implemented in dom0->dom0 calls') | ||||
|             if localcmd: | ||||
|                 raise NotImplementedError( | ||||
|                     'localcmd not implemented in dom0->dom0 calls') | ||||
|             if not wait: | ||||
|                 raise NotImplementedError( | ||||
|                     'wait=False not implemented in dom0->dom0 calls') | ||||
|             if user is None: | ||||
|                 user = grp.getgrnam('qubes').gr_mem[0] | ||||
| 
 | ||||
|             kwargs.setdefault('stdin', subprocess.PIPE) | ||||
|             kwargs.setdefault('stdout', subprocess.PIPE) | ||||
|             kwargs.setdefault('stderr', subprocess.PIPE) | ||||
|             # Set default locale to C in order to prevent error msg | ||||
|             # in subprocess call related to falling back to C locale | ||||
|             env = os.environ.copy() | ||||
|             env['LC_ALL'] = 'C' | ||||
|             cmd = '/etc/qubes-rpc/' + service | ||||
|             arg = '' | ||||
|             if not os.path.exists(cmd) and '+' in service: | ||||
|                 cmd, arg = cmd.split('+', 1) | ||||
|             p = subprocess.Popen( | ||||
|                 ['sudo', '-u', user, cmd, arg], | ||||
|                 **kwargs, | ||||
|                 env=env, | ||||
|             ) | ||||
|             return p | ||||
|         qrexec_opts = ['-d', dest] | ||||
|         if filter_esc: | ||||
|             qrexec_opts.extend(['-t']) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki