o
    iQ                     @   sh  d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dl m!Z! d dl"m#Z# ej$ddddZ%de&fddZ'de(fddZ)e%j*dddej+eej,ddej,dddej-dd d!d"dej-d#d$d%d&dej-dd'd(d)dej-dd*d+d,dfde(de.e( d-e(d.ed/e(d0ee# fd1dZ/e%j*d2d3dej+eej,dd4dej,dd5dej-d#d$d%d&dej-dd'd(d)dfde(d6e(d.ed/e(fd7d2Z0e%j*d8d9dej+eej,dd:dej-dd;d%d<de-dd'd(ej-dd*d+d=dfde(d>ed/e(d0ee# fd?d8Z.e%j*d@dAdej+eej,dBdej-d#d$d%d&de-dd'd(fde(d.ed/e(fdCd@Z1e%j*dDdEdej+eej,dFdej,dGdej,ddHdej-ddIdJdKde-dd'd(ej-dd*d+dLdfde(dMe(dNe(dOe2d/e(d0ee# fdPdQZ3dS )R    N)Optional)boolean)logger)box)Live)Panel)Table)synchronizer)requires_login)console)get_region_codesvalidate_region)PIPECAT_CLI_NAME)API)config)Regionsecretsz'Secret and image pull secret managementT)namehelpno_args_is_helpc                 C   s   t d}|  D ]7\}}|r|std td  S t|dkr/td td  S ||s@td td  S q	d S )Nz^[a-zA-Z0-9_-]+$zl[red]Error: Secrets must be provided as key-value pairs. Please reference --help for more information.[/red]   @   zG[red]Error: Secret names must not exceed 64 characters in length.[/red]zc[red]Error: Secret names must contain only alphanumeric characters, underscores, and hyphens.[/red])	recompileitemsr   printtyperExitlenmatch)r   valid_name_patternkeyvalue r#   U/home/ubuntu/.local/lib/python3.10/site-packages/pipecatcloud/cli/commands/secrets.pyvalidate_secrets&   s"   


r%   r   c                 C   s   t d}t|| S )Nz4^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$)r   r   boolr   )r   r    r#   r#   r$   validate_secret_name;   s   
r'   setz/Create a new secret set for active organization)r   r   z5Name of the secret set to create e.g. 'my-secret-set')r   zJList of secret key-value pairs e.g. 'KEY1=value1 KEY2="value with spaces"'z--filez-fz&Load secrets from a relative file pathFz--skipz-sz-Skip confirmations / force creation or updatez--organizationz-oz$Organization to create secret set inz--regionz-rzRegion for secret set	from_fileskip_confirmorganizationregionc              
      s8  t | std tdS |s|std tdS |r+|r+td tdS i }|p3td}|rtj	|sKtd| d tdS zt
|dt}|D ]i}	|	 }	|	ra|	d	rbqTd
|	vr~td| d td  W  d    W S |	d
d\}
}|
 }
| }|dr|dr|dd }|
r|std|  td  W  d    W S |||
< qTW d    n1 sw   Y  |std|  tdW S W nt ty } ztd| dt|  tdW  Y d }~S d }~ww |D ]L}d
|vrtd td  S |d
d\}
}|
 }
| }|dr;|dr;|dd }|
rA|sMtd td  S |||
< qt| t| |rt|I d H st I d H }td| dd| d tdS |s
tdtjdddd}|jddd |jd dd | D ]\}
}t|d!kr|d d! d" n|}||
| qtd#|   |rtd$| d% nt |I d H \}}|rt S td$|d&  d' tt!|d(d)d* t"#d+$ I d H }|s
tdS d }tj%d,|  d-d.d/, tj&|| d0I d H \}}|r2t W  d    S |r<t|r<|}W d    n	1 sGw   Y  |rd1d2 |D }|'|( }|r|st"#d3|  d4d| d5$ I d H }|std6 tdS d }tj%d7|rd8nd9 d:|  d-d.d/A | D ]4\}
}tj)| d|
|d;| ||d<I d H \}}|rt   W  d    S |rd=|v r|d= }qW d    n	1 sw   Y  |sd>nd?}|rd@| dAndB}dC|  dD| dE| }|d?kr
|dF7 }n|dGt* dH|  dI7 }t+| d S )JNzM[red]Secret set name must only contain characters, numbers and hyphens.[/red]r   zl[red]Command requires either passed key-values or relative file path. See --help for more information.[/red]z3[red]Cannot pass key-value pairs with --file optionorgz[red]Error: File 'z' does not exist.[/red]r#=z#[red]Error: Invalid line format in z?. Each line must be a key-value pair using '=' separator.[/red]"z#Error: Empty key or value found in z!Error: No valid secrets found in zError reading file 'z': zZError: Secrets must be provided as key-value pairs using '=' separator. Example: KEY=valuezF[red]Error: Both key and value must be provided for each secret.[/red][red]Invalid region ''. Valid regions are: , [/red]dimTF)border_styler   show_header	show_edge
show_linesKeywhitestylezValue Preview   z...z&
[bold white]Secret Set:[/bold white] z![bold white]Region:[/bold white] 
defaultRegionz# [dim](organization default)[/dim]
z'[bold]Secrets to create / modify[/bold]lefttitletitle_alignz-Would you like to proceed with these secrets?z7[dim]Checking for existing secret set with name [bold]''[/bold][/dim]dotsspinner)r-   
secret_setc                 S   s   h | ]}|d  qS )	fieldNamer#   ).0secretr#   r#   r$   	<setcomp>   s    zset.<locals>.<setcomp>z)The following secret(s) already exist in z will be overwritten: z. Would you like to continue?z2[bold red]Secret set creation cancelled[/bold red][dim]	ModifyingCreatingz secret set [bold]')r   isImagePullSecret	secretKeysecretValuedataset_namer-   r,   r,   createdmodified in [bold cyan][/bold cyan] Secret set [bold green]'z'[/bold green] z successfullyzh
[bold white]You must re-deploy any agents using this secret set for changes to take effect[/bold white]z
[dim]Deploy your agent with z deploy agent-name --secrets [/dim]),r'   r   r   r   r   r   getospathexistsopenstrip
startswithsplitendswitherror	Exceptionstrr   debugr%   r   r   joinr   r   SIMPLE
add_columnr   r   add_rowr   
propertiesr   questionaryconfirm	ask_asyncstatussecrets_listintersectionkeyssecrets_upsertr   success)r   r   r)   r*   r+   r,   secrets_dictr-   fliner!   r"   erN   valid_regionstablepreviewpropsri   
looks_goodexisting_setrW   existing_secret_namesoverlapping_secretscreateused_regionactionregion_infomessager#   r#   r$   r(   C   sL  "









"

	




unsetz+Delete a secret within specified secret setzCName of the secret set to delete a secret from e.g. 'my-secret-set'z-Name of the secret to delete e.g. 'my-secret'
secret_keyc                    s"  |pt d}| r|std tdS |s5td| d|  d I d H }|s5td tdS tj	d| d	|  d
dd8 t
j| ||dI d H \}}|sgtd|  d t W  d    S |rtt W  d    S W d    n1 s~w   Y  td| d|  d d S )Nr-   zfError: Secret set name and secret name must be provided. Please reference --help for more information.r   z0Are you sure you want to unset secret with key 'z' from set ''?zSecret key unset cancelledz[dim]Deleting secret [bold]'z '[/bold] from secret set [bold]'rG   rH   rI   )rX   secret_namer-   zKey not found in set ''zSecret [bold green]'zA'[/bold green] deleted successfully from secret set [bold green]'z'[/bold green])r   r`   r   ri   r   r   rr   rs   rt   ru   r   secrets_deleterz   )r   r   r*   r+   r-   rs   rW   ri   r#   r#   r$   r   %  sB   




listzList secret sets and set keysz@Name of the secret set to list secrets from e.g. 'my-secret-set'z--setsz?Filter results to show secret sets only (no image pull secrets)zFilter by regionshow_allc                    s  |pt d}d}|r-t|I d H s-t I d H }td| dd| d tdS t	
d|   tjd	| d
dd t j|| |dI d H \}}|rl|dkr]td nt  t W  d    S |rrt|s| rtd|  d| d n	td| d t W  d    S | rtddddd}	|	j| dd |D ]	}
|	|
d  qtt|	d|  ddd n fdd |D }|rt|std!| d t W  d    S tdtjdddd"}	|	jd#dd |	jd$dd  r#|	jd%dd |D ]}|d& d'krd(nd)}|	|d* |d+ | qn|D ]}|	|d* |d+  q%tj|	d,| d- W d    d S W d    d S 1 sQw   Y  d S ).Nr-   zRetrieving secret setsr3   r4   r5   r6   r   zSecret set name to lookup: rP   r_   rH   rI   )r-   rK   r,   i  z#Unable to lookup image pull secretsz!No secrets sets with name [bold]'z'[/bold] found in [bold]''[/bold]z4No secrets sets for namespace / organization [bold]'r7   FT)r8   r9   r:   r;   r=   r>   rL   z![bold]Secret keys for set [green]z[/green][/bold]rC   rD   c                    s    g | ]} s|d  dkr|qS )typeimagePullSecretr#   rM   sr   r#   r$   
<listcomp>  s     zlist.<locals>.<listcomp>z2No secret sets in namespace / organization [bold]')r9   r   r8   r:   r;   zSecret Set Namer   Typer   r   zImage Pull Secretz
Secret Setr   r,   zSecret sets for )title_extra)r   r`   r   r   r   r   rm   r   r   r   rl   ru   r   bubble_errorrv   ri   print_errorr   r   ro   rp   r   r   rn   rz   )r   r   r+   r,   r-   status_titler   rW   ri   r   r   filtered_setsrK   set_typer#   r   r$   r   `  s   


	)$deletez,Delete a secret set from active organizationz5Name of the secret set to delete e.g. 'my-secret-set'c                    s   |pt d}|s$td|  d I d H }|s$td tdS tj	d|  ddd	8 t
j| |d
I d H \}}|sRtd|   tdW  d    S |r`tdW  d    S W d    n1 sjw   Y  td|  d d S )Nr-   z,Are you sure you want to delete secret set 'r   z.[bold red]Secret deletion cancelled[/bold red]r   zDeleting secret set [bold]'r   rH   rI   )rX   r-   zNo set found with name 'r^   z#'[/bold green] deleted successfully)r   r`   rr   rs   rt   r   r   r   r   ru   r   secrets_delete_setri   rz   )r   r*   r+   r-   rs   rW   ri   r#   r#   r$   r     s.   



zimage-pull-secretz4Create an image pull secret for active organization.zTName of the image pull secret to reference in deployment e.g. 'my-image-pull-secret'zEHost address of the image repository e.g. https://index.docker.io/v1/z<Credentials of the image repository e.g. 'username:password'z--encodez-ez,base64 encode credentials for added securityzRegion for image pull secrethostcredentialsbase64encodec              	      sh  |pt d} r|std tdS |sNtd td| d	 I d H }t
d| d	 I d H }|r=|sGtd tdS | d	| }|rYt|  }|r|t|I d H s|t I d H }	td
| dd|	 d tdS d }
ttjd  ddddd}tj|dI d H \}}|rt W  d    S |rt fdd|D d }|r|  td  d tdW  d    S |tjd  ddd tjd||d ||dI d H \}}|rt W  d    S |rd|v r|d }
W d    n	1 sw   Y  |
r!d|
 d nd!}td"  d#| d$| d% d S )&Nr-   zMName and host must be provided. Please reference --help for more information.r   z[cyan]For more information about image pull secrets, see: https://docs.pipecat.daily.co/agents/secrets#image-pull-secrets[/cyan]
zUsername for image repository 'r   z#Access token for image repository 'z9[bold red]Image pull secret creation cancelled[/bold red]:r3   r4   r5   r6   z$[dim]Checking if image pull secret 'z' already exists[/dim]rH   rI      )refresh_per_second)r-   c                 3   s,    | ]}|d   kr|d dkr|V  qdS )r   r   r   Nr#   r   r   r#   r$   	<genexpr><  s   * z$image_pull_secret.<locals>.<genexpr>zImage pull secret '[bold]zY'[/bold] already exists. Please choose a different name or delete the existing one first.z'[dim]Creating image pull secret [bold]'rG   T)rS   rU   r   rV   r,   r[   r\   r]   zImage pull secret [bold green]'z'[/bold green] for [bold green]z"[/bold green] created successfully.)r   r`   r   ri   r   r   r   rr   textrt   passwordbase64	b64encodeencodedecoder   r   rm   r   ru   r   rv   nextstopupdatery   rz   )r   r   r   r   r+   r,   r-   usernamer   r   r   liverW   ri   existing_secretr   r#   r   r$   image_pull_secret  s   






'*r   )4r   ra   r   typingr   xmlrpc.clientr   rr   r   logurur   richr   	rich.liver   
rich.panelr   
rich.tabler   pipecatcloud._utils.async_utilsr	   pipecatcloud._utils.auth_utilsr
   !pipecatcloud._utils.console_utilsr   pipecatcloud._utils.regionsr   r   pipecatcloud.clir   pipecatcloud.cli.apir   pipecatcloud.cli.configr   pipecatcloud.constantsr   Typersecrets_clidictr%   rk   r'   commandcreate_blockingArgumentOptionr   r(   r   r   r&   r   r#   r#   r#   r$   <module>   s  
 `8
a
&
