async def METHOD_NAME():
	logging.basicConfig(stream=sys.stdout)
	logger = logging.getLogger()
	logger.setLevel(logging.INFO)
	# check for creds in environment and set them as global vars
	required_env_vars = [
			'SIS_CLASSES_ID', 'SIS_CLASSES_KEY',
		'SIS_ENROLLMENTS_ID', 'SIS_ENROLLMENTS_KEY',
		   'SIS_STUDENTS_ID', 'SIS_STUDENTS_KEY',
			  'SIS_TERMS_ID', 'SIS_TERMS_KEY',
				 'UCB_HR_ID', 'UCB_HR_KEY',
	]
	for v in required_env_vars:
		assert v in os.environ, f"{v} not defined in environment."
		globals()[v] = os.environ[v]
	# arg parsing
	parser = argparse.ArgumentParser(
        description="Get UCB course enrollee and instructor email addresses.")
	parser.add_argument('-d', dest='debug', action='store_true',
		help='set debug log level')
	parser.add_argument('-v', dest='verbose', action='store_true',
		help='set info log level')
	parser.add_argument('-c', '--values',
		default='/etc/jupyterhub/config/values.yaml',
		help='path to jupyterhub config values')
	parser.add_argument('-p', '--profile_dir',
		default='/srv/jupyterhub/profiles.d',
		help='path to profiles output directory')
	args = parser.parse_args()
	if args.debug:
		logger.setLevel(logging.DEBUG)
	elif args.verbose:
		logger.setLevel(logging.INFO)
	while True:
		# read custom.profiles from jupyterhub config values
		profiles = read_profiles(args.values)
		for profile in profiles:
			# don't bail on bad profiles
			try:
				await handle_profile(profile, args.profile_dir)
			except Exception as e:
				print(f'Error: {e}')
				continue
		time.sleep(86400)