2012-06-01 20:59:45 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
import xen.lowlevel.xs
|
|
|
|
import time
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
xs = xen.lowlevel.xs.xs()
|
|
|
|
|
|
|
|
domain_list = []
|
|
|
|
|
|
|
|
def setup_watches():
|
|
|
|
global domain_list
|
|
|
|
|
|
|
|
new_domain_list = xs.ls('', '/local/domain')
|
|
|
|
for dom in new_domain_list:
|
|
|
|
if dom not in domain_list:
|
|
|
|
print "Adding: %s" % dom
|
|
|
|
xs.watch('/local/domain/%s/backend/vbd' % dom, int(dom))
|
|
|
|
for dom in domain_list:
|
|
|
|
if dom not in new_domain_list:
|
|
|
|
print "Removing: %s" % dom
|
|
|
|
xs.unwatch('/local/domain/%s/backend/vbd' % dom, int(dom))
|
|
|
|
domain_list = new_domain_list
|
|
|
|
|
|
|
|
def handle_vbd_state(path):
|
|
|
|
state = xs.read('', path)
|
|
|
|
if state == '6':
|
|
|
|
# Closed state; wait a moment to not interrupt reconnect
|
|
|
|
time.sleep(0.500)
|
|
|
|
state = xs.read('', path)
|
|
|
|
if state == '6':
|
|
|
|
# If still closed, detach device
|
|
|
|
path_components = path.split('/')
|
|
|
|
# /local/domain/<BACK XID>/backend/vbd/<FRONT XID>/<DEV>/...
|
|
|
|
vm_xid = path_components[6]
|
|
|
|
vm_dev = path_components[7]
|
|
|
|
if vm_xid in domain_list:
|
2012-07-15 19:48:36 +02:00
|
|
|
subprocess.call(['xl', 'block-detach', vm_xid, vm_dev])
|
2012-06-01 20:59:45 +02:00
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
|
|
xs.watch('@introduceDomain', 'reload')
|
|
|
|
xs.watch('@releaseDomain', 'reload')
|
|
|
|
setup_watches()
|
|
|
|
while True:
|
|
|
|
(path, token) = xs.read_watch()
|
|
|
|
if token == 'reload':
|
|
|
|
setup_watches()
|
|
|
|
else:
|
|
|
|
if path.endswith('/state'):
|
|
|
|
handle_vbd_state(path)
|
|
|
|
|
|
|
|
main()
|