#!/usr/bin/python3

import dbus
import sys

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object('org.ofono', '/'),
						'org.ofono.Manager')

modems = manager.GetModems()

for path, properties in modems:
	print("[ %s ]" % (path))

	if "org.ofono.NetworkRegistration" not in properties["Interfaces"]:
		continue

	netreg = dbus.Interface(bus.get_object('org.ofono', path),
					'org.ofono.NetworkRegistration')

	if len(sys.argv) == 2 and sys.argv[1] == 'scan':
		operators = netreg.Scan()
	else:
		operators = netreg.GetOperators()

	for path, properties in operators:
		print("    [ %s ]" % (path))

		for key in properties.keys():
			if key in ["Technologies"]:
				val = ""
				for i in properties[key]:
					val += i + " "
			else:
				val = str(properties[key])
			print("        %s = %s" % (key, val))

		print('')
