#!/usr/bin/env python

import os
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-v", "--verbose", dest="verbose",
		   help="print verbose messages. Try -vv, -vvv for \
			more verbose messages", action="count")

(options, args) = parser.parse_args()

verbose = 0
if options.verbose is not None:
	verbose = options.verbose

vmbus_sys_path = '/sys/bus/vmbus/devices'
if not os.path.isdir(vmbus_sys_path):
	print "%s doesn't exist: exiting..." % vmbus_sys_path
	exit(-1)

vmbus_dev_dict = {
	'{0e0b6031-5213-4934-818b-38d90ced39db}' : '[Operating system shutdown]',
	'{9527e630-d0ae-497b-adce-e80ab0175caf}' : '[Time Synchronization]',
	'{57164f39-9115-4e78-ab55-382f3bd5422d}' : '[Heartbeat]',
	'{a9a0f4e7-5a45-4d96-b827-8a841e8c03e6}' : '[Data Exchange]',
	'{35fa2e29-ea23-4236-96ae-3a6ebacba440}' : '[Backup (volume checkpoint)]',
	'{34d14be3-dee4-41c8-9ae7-6b174977c192}' : '[Guest services]',
	'{525074dc-8985-46e2-8057-a307dc18a502}' : '[Dynamic Memory]',
	'{cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a}' : 'Synthetic mouse',
	'{f912ad6d-2b17-48ea-bd65-f927a61c7684}' : 'Synthetic keyboard',
	'{da0a7802-e377-4aac-8e77-0558eb1073f8}' : 'Synthetic framebuffer adapter',
	'{f8615163-df3e-46c5-913f-f2d2f965ed0e}' : 'Synthetic network adapter',
	'{32412632-86cb-44a2-9b5c-50d1417354f5}' : 'Synthetic IDE Controller',
	'{ba6163d9-04a1-4d29-b605-72e2ffb1dc7f}' : 'Synthetic SCSI Controller',
	'{2f9bcc4a-0069-4af3-b76b-6fd0be528cda}' : 'Synthetic fiber channel adapter',
	'{8c2eaf3d-32a7-4b09-ab99-bd1f1c86b501}' : 'Synthetic RDMA adapter',
	'{44c4f61d-4444-4400-9d52-802e27ede19f}' : 'PCI Express pass-through',
	'{276aacf4-ac15-426c-98dd-7521ad3f01fe}' : '[Reserved system device]',
	'{f8e65716-3cb3-4a06-9a60-1889c5cccab5}' : '[Reserved system device]',
	'{3375baf4-9e15-4b30-b765-67acb10d607b}' : '[Reserved system device]',
}

def get_vmbus_dev_attr(dev_name, attr):
	try:
		f = open('%s/%s/%s' % (vmbus_sys_path, dev_name, attr), 'r')
		lines = f.readlines()
		f.close()
	except IOError:
		lines = []

	return lines

class VMBus_Dev:
	pass


vmbus_dev_list = []

for f in os.listdir(vmbus_sys_path):
	vmbus_id = get_vmbus_dev_attr(f, 'id')[0].strip()
	class_id = get_vmbus_dev_attr(f, 'class_id')[0].strip()
	device_id = get_vmbus_dev_attr(f, 'device_id')[0].strip()
	dev_desc = vmbus_dev_dict.get(class_id, 'Unknown')

	chn_vp_mapping = get_vmbus_dev_attr(f, 'channel_vp_mapping')
	chn_vp_mapping = [c.strip() for c in chn_vp_mapping]
	chn_vp_mapping = sorted(chn_vp_mapping,
		key = lambda c : int(c.split(':')[0]))

	chn_vp_mapping = ['\tRel_ID=%s, target_cpu=%s' %
				(c.split(':')[0], c.split(':')[1])
					for c in chn_vp_mapping]
	d = VMBus_Dev()
	d.sysfs_path = '%s/%s' % (vmbus_sys_path, f)
	d.vmbus_id = vmbus_id
	d.class_id = class_id
	d.device_id = device_id
	d.dev_desc = dev_desc
	d.chn_vp_mapping = '\n'.join(chn_vp_mapping)
	if d.chn_vp_mapping:
		d.chn_vp_mapping += '\n'

	vmbus_dev_list.append(d)


vmbus_dev_list  = sorted(vmbus_dev_list, key = lambda d : int(d.vmbus_id))

format0 = '%2s: %s'
format1 = '%2s: Class_ID = %s - %s\n%s'
format2 = '%2s: Class_ID = %s - %s\n\tDevice_ID = %s\n\tSysfs path: %s\n%s'

for d in vmbus_dev_list:
	if verbose == 0:
		print ('VMBUS ID ' + format0) % (d.vmbus_id, d.dev_desc)
	elif verbose == 1:
		print ('VMBUS ID ' + format1) %	\
			(d.vmbus_id, d.class_id, d.dev_desc, d.chn_vp_mapping)
	else:
		print ('VMBUS ID ' + format2) % \
			(d.vmbus_id, d.class_id, d.dev_desc, \
			d.device_id, d.sysfs_path, d.chn_vp_mapping)
