dom0/qvm-run: move run code to qubesutils

This commit is contained in:
Marek Marczykowski 2011-10-31 13:31:17 +01:00
parent a4e11dedd9
commit 870dea1502
3 changed files with 71 additions and 71 deletions

View File

@ -49,6 +49,7 @@ if not dry_run:
qubes_guid_path = "/usr/bin/qubes_guid"
qrexec_daemon_path = "/usr/lib/qubes/qrexec_daemon"
qrexec_client_path = "/usr/lib/qubes/qrexec_client"
qubes_clipd_path = "/usr/bin/qclipd"
qubes_base_dir = "/var/lib/qubes"

View File

@ -21,9 +21,9 @@
#
from qubes import QubesVm,QubesException
from qubes import xs, xl_ctx
from qubes import xs, xl_ctx, qubes_guid_path, qubes_clipd_path, qrexec_client_path
import sys
#import os
import os
#import os.path
import subprocess
#import fcntl
@ -229,4 +229,56 @@ def block_detach(vm, frontend = "xvdi", vm_xid = None):
xl_cmd = [ '/usr/sbin/xl', 'block-detach', str(vm_xid), str(frontend)]
subprocess.check_call(xl_cmd)
def start_guid(vm, verbose = True, notify_function = None):
if verbose:
print >> sys.stderr, "--> Starting Qubes GUId..."
xid = vm.get_xid()
retcode = subprocess.call ([qubes_guid_path, "-d", str(xid), "-c", vm.label.color, "-i", vm.label.icon, "-l", str(vm.label.index)])
if (retcode != 0) :
raise QubesException("Cannot start qubes_guid!")
if verbose:
print >> sys.stderr, "--> Waiting for qubes-session..."
subprocess.call([qrexec_client_path, "-d", str(xid), "user:echo $$ >> /tmp/qubes-session-waiter; [ ! -f /tmp/qubes-session-env ] && exec sleep 365d"])
retcode = subprocess.call([qubes_clipd_path])
if retcode != 0:
print >> sys.stderr, "ERROR: Cannot start qclipd!"
if notify_function is not None:
notify_function("error", "ERROR: Cannot start the Qubes Clipboard Notifier!")
def run_in_vm(vm, command, verbose = True, autostart = False, notify_function = None, passio = False, localcmd = None):
assert vm is not None
if not vm.is_running():
if not autostart:
raise QubesException("VM not running")
try:
if verbose:
print >> sys.stderr, "Starting the VM '{0}'...".format(vm.name)
if notify_function is not None:
notify_function ("info", "Starting the '{0}' VM...".format(vm.name), label=vm.label)
xid = vm.start(verbose=verbose)
except (IOError, OSError, QubesException) as err:
raise QubesException("Error while starting the '{0}' VM: {1}".format(vm.name, err))
except (MemoryError) as err:
raise QubesException("Not enough memory to start '{0}' VM! Close one or more running VMs and try again.".format(vm.name))
xid = vm.get_xid()
if os.getenv("DISPLAY") is not None and not os.path.isfile("/var/run/qubes/guid_running.{0}".format(xid)):
start_guid(vm, verbose = verbose, notify_function = notify_function)
args = [qrexec_client_path, "-d", str(xid), command]
if localcmd is not None:
args += [ "-l", localcmd]
if passio:
os.execv(qrexec_client_path, args)
exit(1)
args += ["-e"]
return subprocess.call(args)
# vim:sw=4:et:

View File

@ -24,6 +24,7 @@
from qubes.qubes import QubesVmCollection
from qubes.qubes import QubesException
from optparse import OptionParser
from qubes import qubesutils
import subprocess
import socket
import errno
@ -33,9 +34,7 @@ import sys
import os
import os.path
qubes_guid_path = "/usr/bin/qubes_guid"
qubes_clipd_path = "/usr/bin/qclipd"
qrexec_client_path = "/usr/lib/qubes/qrexec_client"
notify_object = None
# how long (in sec) to wait for VMs to shutdown
@ -48,33 +47,11 @@ def tray_notify(str, label, timeout = 3000):
def tray_notify_error(str, timeout = 3000):
notify_object.Notify("Qubes", 0, "dialog-error", "Qubes", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
def actually_execute(domid, cmd, options):
args = [qrexec_client_path, "-d", domid, cmd]
if options.localcmd is not None:
args += [ "-l", options.localcmd]
if options.passio and not options.run_on_all_running:
os.execv(qrexec_client_path, args)
exit(1)
args += ["-e"]
subprocess.call(args)
def start_guid(vm, options):
if options.verbose:
print >> sys.stderr, "--> Starting Qubes GUId..."
xid = vm.get_xid()
retcode = subprocess.call ([qubes_guid_path, "-d", str(xid), "-c", vm.label.color, "-i", vm.label.icon, "-l", str(vm.label.index)])
if (retcode != 0) :
print >> sys.stderr, "ERROR: Cannot start qubes_guid!"
if options.tray:
tray_notify_error ("ERROR: Cannot start qubes_guid!")
exit (1)
if options.verbose:
print >> sys.stderr, "--> Waiting for qubes-session..."
subprocess.call([qrexec_client_path, "-d", str(xid), "user:echo $$ >> /tmp/qubes-session-waiter; [ ! -f /tmp/qubes-session-env ] && exec sleep 365d"])
def tray_notify_generic(level, str):
if level == "info":
tray_notify(str)
elif level == "error":
tray_notify_error(str)
def vm_run_cmd(vm, cmd, options):
if options.shutdown:
@ -105,39 +82,14 @@ def vm_run_cmd(vm, cmd, options):
if options.verbose:
print >> sys.stderr, "Running command on VM: '{0}'...".format(vm.name)
if not vm.is_running():
if not options.auto:
print >> sys.stderr, "VM '{0}' is not running. Please start it first or use the '--auto' switch".format(vm.name)
exit (1)
try:
if options.verbose:
print >> sys.stderr, "Starting the VM '{0}'...".format(vm.name)
if options.tray:
tray_notify ("Starting the '{0}' VM...".format(vm.name), label=vm.label)
xid = vm.start(verbose=options.verbose)
except (IOError, OSError, QubesException) as err:
print >> sys.stderr, "ERROR: {0}".format(err)
if options.tray:
tray_notify_error ("Error while starting the '{0}' VM: {1}".format(vm.name, err))
exit (1)
except (MemoryError) as err:
print >> sys.stderr, "ERROR: {0}".format(err)
print >> sys.stderr, "Close one or more running VMs and try again."
if options.tray:
subprocess.call(["kdialog", "--error", "Not enough memory to start '{0}' VM! Close one or more running VMs and try again.".format(vm.name)])
exit (1)
if os.getenv("DISPLAY") is not None:
start_guid(vm, options)
actually_execute(str(xid), cmd, options);
else: # VM already running...
xid = vm.get_xid()
if os.getenv("DISPLAY") is not None and not os.path.isfile("/var/run/qubes/guid_running.{0}".format(xid)):
start_guid(vm, options)
actually_execute(str(xid), cmd, options);
try:
return qubesutils.run_in_vm(vm, cmd, autostart = options.auto,
verbose = options.verbose,
notify_function = tray_notify_generic if options.tray else None,
passio = options.passio, localcmd = options.localcmd)
except QubesException as err:
print >> sys.stderr, "ERROR: %s" % str(err)
exit(1)
def main():
usage = "usage: %prog [options] [<vm-name>] [<cmd>]"
@ -223,6 +175,8 @@ def main():
continue
if (options.unpause and vm.is_paused()) or (not options.unpause and vm.is_running()):
vms_list.append (vm)
# disable options incompatible with --all
options.passio = False
else:
vm = qvm_collection.get_vm_by_name(vmname)
if vm is None:
@ -261,11 +215,4 @@ def main():
time.sleep (1)
exit (0) # there is no point in executing the other daemons in the case of --wait
retcode = subprocess.call([qubes_clipd_path])
if retcode != 0:
print >> sys.stderr, "ERROR: Cannot start qclipd!"
if options.tray:
tray_notify ("ERROR: Cannot start the Qubes Clipboard Notifier!")
main()