#!/usr/bin/env python3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  argparse 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								from  openpilot . system . hardware  import  HARDWARE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								if  __name__  ==  ' __main__ ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser  =  argparse . ArgumentParser ( prog = ' esim.py ' ,  description = ' manage eSIM profiles on your comma device ' ,  epilog = ' comma.ai ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser . add_argument ( ' --backend ' ,  choices = [ ' qmi ' ,  ' at ' ] ,  default = ' qmi ' ,  help = ' use the specified backend, defaults to qmi ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser . add_argument ( ' --switch ' ,  metavar = ' iccid ' ,  help = ' switch to profile ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser . add_argument ( ' --delete ' ,  metavar = ' iccid ' ,  help = ' delete profile (warning: this cannot be undone) ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser . add_argument ( ' --download ' ,  nargs = 2 ,  metavar = ( ' qr ' ,  ' name ' ) ,  help = ' download a profile using QR code (format: LPA:1$rsp.truphone.com$QRF-SPEEDTEST) ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  parser . add_argument ( ' --nickname ' ,  nargs = 2 ,  metavar = ( ' iccid ' ,  ' name ' ) ,  help = ' update the nickname for a profile ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  args  =  parser . parse_args ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  mutated  =  False 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  lpa  =  HARDWARE . get_sim_lpa ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  args . switch : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    lpa . switch_profile ( args . switch ) 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    mutated  =  True 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  elif  args . delete : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    confirm  =  input ( ' are you sure you want to delete this profile? (y/N)  ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  confirm  ==  ' y ' : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      lpa . delete_profile ( args . delete ) 
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      mutated  =  True 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      print ( ' cancelled ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      exit ( 0 ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  elif  args . download : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    lpa . download_profile ( args . download [ 0 ] ,  args . download [ 1 ] ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  elif  args . nickname : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    lpa . nickname_profile ( args . nickname [ 0 ] ,  args . nickname [ 1 ] ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  else : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    parser . print_help ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  if  mutated : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    HARDWARE . reboot_modem ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # eUICC needs a small delay post-reboot before querying profiles 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    time . sleep ( .5 ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  profiles  =  lpa . list_profiles ( ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  print ( f ' \n { len ( profiles ) }  profile { " s "  if  len ( profiles )  >  1  else  " " } : ' ) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  p  in  profiles : 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    print ( f ' -  { p . iccid }  (nickname:  { p . nickname  or  " <none provided> " } ) (provider:  { p . provider } ) -  { " enabled "  if  p . enabled  else  " disabled " } ' )