50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
##
|
||
|
## This script is for dom0
|
||
|
## The syntax is modelled after "xl block-attach"
|
||
|
## FIXME: should be modelled after block-detach instead
|
||
|
##
|
||
|
|
||
|
import sys
|
||
|
import os
|
||
|
import xen.lowlevel.xl
|
||
|
|
||
|
# parse command line
|
||
|
if (len(sys.argv)<4) or (len(sys.argv)>5):
|
||
|
print 'usage: xl-qvm-usb-detach.py <frontendvm-xid> <backendvm-device> <frontendvm-device> [<backendvm-xid>]'
|
||
|
sys.exit(1)
|
||
|
|
||
|
frontendvm_xid=sys.argv[1]
|
||
|
backendvm_device=sys.argv[2]
|
||
|
|
||
|
frontend=sys.argv[3].split('-')
|
||
|
if len(frontend)!=2:
|
||
|
print 'Error: frontendvm-device must be in <controller>-<port> format'
|
||
|
sys.exit(1)
|
||
|
(controller, port)=frontend
|
||
|
|
||
|
if len(sys.argv)>4:
|
||
|
backendvm_xid=int(sys.argv[4])
|
||
|
backendvm_name=xen.lowlevel.xl.ctx().domid_to_name(backendvm_xid)
|
||
|
else:
|
||
|
backendvm_xid=0
|
||
|
|
||
|
cmd = "/usr/lib/qubes/vusb-ctl.py unbind '%s'" % backendvm_device
|
||
|
if backendvm_xid == 0:
|
||
|
os.system("sudo %s" % cmd)
|
||
|
else:
|
||
|
from qubes.qubes import QubesVmCollection
|
||
|
qvm_collection = QubesVmCollection()
|
||
|
qvm_collection.lock_db_for_reading()
|
||
|
qvm_collection.load()
|
||
|
qvm_collection.unlock_db()
|
||
|
|
||
|
# launch
|
||
|
qvm_collection.get_vm_by_name(backendvm_name).run("root: %s" % cmd)
|
||
|
|
||
|
# FIXME: command injection
|
||
|
os.system("xenstore-write /local/domain/%s/backend/vusb/%s/%s/port/%s ''"
|
||
|
% (backendvm_xid, frontendvm_xid, controller, port))
|
||
|
|