#!/usr/bin/env python
# SPDX-License-Identifier: GPL-2.0

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))
