
    bi                         d dl Z d dlZ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mZ d dlmZ d dlmZ d dlmZ  G d d	      Zy)
    N)Path)Optional)BytesIO)	lru_cache)	Container)Imagec            	          e Zd ZdZi ZdZdZ ed      j                         Z	 e
j                  d        ed        Zedej                  defd	       Zeded
edefd       Zeded
edefd       Zed
efd       Zedefd       Zedej                  defd       Zeddededee   fd       Zedededefd       Ze ed      defd              Zedefd       Z y)WebRTCManageri  z"nvidia/devtools/nsight-streamer-{}
   z/.dockerenvc                      t         j                  j                         D  cg c]  } | j                          c} S c c} w N)r
   report_path_to_containervaluesstop)	containers    d/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jupyterlab_nvidia_nsight/webrtc_container.py<lambda>zWebRTCManager.<lambda>"   s*    =3Y3Y3`3`3bci!c cs   ;c                     	 t        j                         S # t         j                  j                  $ r'}| j                  rd}nd}|dz  }t        |      |d }~ww xY w)NzFailed to start docker client. Is the docker socket mounted? (try adding "-v /var/run/docker.sock:/var/run/docker.sock" to the docker run command).zgFailed to start docker client. Is the docker service running? (start it with "systemctl start docker").z Also make sure you have sufficient permissions, see: https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)dockerDockerClienterrorsDockerExceptioninside_dockerRuntimeError)clsemessages      r   get_docker_clientzWebRTCManager.get_docker_client$   sh    	/&&((}},, 	/  2@  m mGw'Q.	/s    A"AAdocker_client	tool_typec                     | j                  |      }d| j                  j                  |       }|j                  j	                  | d|       S Nznvcr.io/:)get_latest_image_version
image_nameformatimagesget)r   r   r    versionimages        r   get_docker_imagezWebRTCManager.get_docker_image5   sP    ..y93>>00;<=##''5'7)(<==    report_pathhostc                    | j                         }| j                  ||      }| j                  r| j                  ||      \  }}nd | j	                         }}| j                  |d      }| j                  |||i}	| d|j                   |t        |      dd}
|j                  j                  ||	|
dd      }| j                  ||       |j                          || j                  |<   y )NDEVTOOL_CMDz /mnt/host/ )r0   HOST_IP	TURN_PORTWEB_USERNAMET)r*   portsenvironmentdetachauto_remove)r   r+   r   _get_free_ports_for_container_get_free_portget_image_env_var	http_portnamestr
containerscreate_copy_to_containerstartr   )r   r    r-   r.   clientr*   r<   	turn_portdevtool_cmdr5   r6   r   s               r   create_containerzWebRTCManager.create_container;   s    &&($$VY7#&#D#DVU#S Iy#'););)=yI++E=A	9i@)]+k6F6F5GHY	
 %%,,# - 
	 	y+64=$$[1r,   c                     || j                   vr| j                  |||       | j                   |   }| j                         j                  j	                  |j
                  | j                        d   d   S )Nr   HostPort)r   rF   r   apiportidr<   )r   r    r-   r.   r   s        r   runzWebRTCManager.run[   sg    c:::  K>00=	$$&**//	cmmLQOPZ[[r,   c                 X    | j                   |   j                          | j                   |= y r   )r   r   )r   r-   s     r   r   zWebRTCManager.stopb   s'    $$[1668((5r,   returnc                      t        j                          5 } | j                  d       | j                         d   cd d d        S # 1 sw Y   y xY w)N)r1   r      )socketbindgetsockname)ss    r   r:   zWebRTCManager._get_free_portg   s;    ]]_ 	&FF7O==?1%	& 	& 	&s   $AArC   r*   c                    | j                   j                  |ddddt        j                  dt        j                  dz   di      }| j                  j                  |j                  t        j                        d   d   }| j                  j                  |j                  t        j                  dz         d   d   }|j                          ||fS )	a~  
        Get two free ports from the docker host (to be used as HTTP and TURN ports).
        This method is used when running inside a docker container.
        Since we can't get the host's ports directly, we start a container
        and let docker assign the ports. We then stop the container and return the ports,
        to be used when creating the actual container.
        zsleep infinityTSIGKILLNrP   )r*   commandr7   removestop_signalr5   r   rH   )r?   rL   r
   r<   rI   rJ   rK   r   )rC   r*   r   r<   rD   s        r   r9   z+WebRTCManager._get_free_ports_for_containerm   s      &0044!1$tYb **D-2I2IA2MtT  5  V	 JJOOILL-2I2IJ1MjY	JJOOILL-2I2IA2MNqQR\]	)##r,   Nr   srcarcnamec                     t               }t        j                  |d      5 }|j                  ||xs |j                         d d d        | j                  d|j                                y # 1 sw Y   *xY w)Nzw|)fileobjmode)r[   z	/mnt/host)r   tarfileopenaddr=   put_archivegetvalue)r   rZ   r[   streamtars        r   rA   z WebRTCManager._copy_to_container~   s`    \\&t4 	6GGC!4CHHG5	6 	k6??+<=	6 	6s   "A--A6env_varc                 x    t        t        fd| j                  d   d               j                  d      d   S )Nc                 ,    | j                   d      S )N=)
startswith)xrf   s    r   r   z1WebRTCManager.get_image_env_var.<locals>.<lambda>   s    Q\\WIQ-%@ r,   ConfigEnvri   rP   )nextfilterattrssplit)r*   rf   s    `r   r;   zWebRTCManager.get_image_env_var   s9    F@%++hBWX]B^_ sA 	r,   )maxsizec                    t         j                  j                  d| j                  j	                  |             5 }t        j                  |j                         j                               d   cd d d        S # 1 sw Y   y xY w)Nz$https://api.ngc.nvidia.com/v2/repos/	latestTag)	urllibrequesturlopenr%   r&   jsonloadsreaddecode)r   r    responses      r   r$   z&WebRTCManager.get_latest_image_version   sl     ^^##23>>3H3H3S2TU
 	E::hmmo4467D	E 	E 	Es   4A::Bc                     | j                         j                  j                  d| j                  j	                  |       d| j                  |      z          y r"   )r   r'   pullr%   r&   r$   )r   r    s     r   
pull_imagezWebRTCManager.pull_image   sN    &&++s~~,,Y78:**956	7r,   r   )!__name__
__module____qualname__r<   r   r%   timeoutr   existsr   atexitregisterclassmethodr   r   r   r>   r+   rF   rL   r   staticmethodintr:   r   r9   r   r   rA   r;   r   r$   r    r,   r   r
   r
      s   I!5JG'..0MFOOce / /  >V-@-@ >S > >
 > >4 >s > >> \C \d \# \ \ 6t 6 6 &C & &
 $f.A.A $% $ $  >i >d >Xc] > >      tE E  E 73 7 7r,   r
   )r   rQ   r   rx   urllib.requestru   pathlibr   typingr   r_   ior   	functoolsr   docker.models.containersr   docker.models.imagesr   r
   r   r,   r   <module>r      s7              . &}7 }7r,   