§
    ‰eîi‡X  ã                   óœ  — U d Z ddlZddlZ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mZ ddlmZ  ej        e¦  «        Zg d¢Zdae	e         ed<    ej        d¦  «        Zd	ee         dz  d
ee         fd„Zdedz  d
eeef         fd„Zd
eeef         fd„Zd
e	e         fd„Zg d¢Zdae	e          ed<   dd„Z! G d„ de¦  «        Z"dS )zçDocker execution environment for sandboxed command execution.

Security hardened (cap-drop ALL, no-new-privileges, PID limits),
configurable resource limits (CPU, memory, disk), and optional filesystem
persistence via bind mounts.
é    N)ÚOptional)ÚBaseEnvironmentÚ_popen_bash)Ú_HERMES_PROVIDER_ENV_BLOCKLIST)z/usr/local/bin/dockerz/opt/homebrew/bin/dockerz6/Applications/Docker.app/Contents/Resources/bin/dockerÚ_docker_executablez^[A-Za-z_][A-Za-z0-9_]*$Úforward_envÚreturnc                 óŽ  — g }t          ¦   «         }| pg D ]¯}t          |t          ¦  «        st                               d|¦  «         Œ3|                     ¦   «         }|sŒJt                               |¦  «        st                               d|¦  «         Œ€||v rŒ…|                     |¦  «         | 	                    |¦  «         Œ°|S )z?Return a deduplicated list of valid environment variable names.z0Ignoring non-string docker_forward_env entry: %rz-Ignoring invalid docker_forward_env entry: %r)
ÚsetÚ
isinstanceÚstrÚloggerÚwarningÚstripÚ_ENV_VAR_NAME_REÚmatchÚaddÚappend)r   Ú
normalizedÚseenÚitemÚkeys        ú;/home/div/.hermes/hermes-agent/tools/environments/docker.pyÚ_normalize_forward_env_namesr   $   sÌ   € à€JÝ‘U”U€DàÐ!˜rð ð ˆÝ˜$¥Ñ$Ô$ð 	Ý�NŠNÐMÈtÑTÔTÐTØà�jŠj‰lŒlˆØð 	ØÝ×%Ò% cÑ*Ô*ð 	Ý�NŠNÐJÈDÑQÔQÐQØØ�$ˆ;ˆ;Øà�Š�‰ŒˆØ×Ò˜#ÑÔÐÐàÐó    Úenvc                 ó^  — | si S t          | t          ¦  «        st                               d| ¦  «         i S i }|                      ¦   «         D ]ß\  }}t          |t
          ¦  «        r,t                               |                     ¦   «         ¦  «        st                               d|¦  «         Œb|                     ¦   «         }t          |t
          ¦  «        sOt          |t          t          t          f¦  «        rt          |¦  «        }nt                               d||¦  «         ŒÚ|||<   Œà|S )z‡Validate and normalize a docker_env dict to {str: str}.

    Filters out entries with invalid variable names or non-string values.
    zdocker_env is not a dict: %rz#Ignoring invalid docker_env key: %rz/Ignoring non-string docker_env value for %r: %r)r   Údictr   r   Úitemsr   r   r   r   ÚintÚfloatÚbool)r   r   r   Úvalues       r   Ú_normalize_env_dictr$   =   s  € ð
 ð Øˆ	Ý�c�4Ñ Ô ð Ý�ŠÐ5°sÑ;Ô;Ð;Øˆ	à!#€JØ—i’i‘k”kð  ð  ‰
ˆˆUÝ˜#�sÑ#Ô#ð 	Õ+;×+AÒ+AÀ#Ç)Â)Á+Ä+Ñ+NÔ+Nð 	Ý�NŠNÐ@À#ÑFÔFÐFØØ�iŠi‰kŒkˆÝ˜%¥Ñ%Ô%ð 	õ ˜%¥#¥u­dÐ!3Ñ4Ô4ð Ý˜E™
œ
��å—’ÐPÐRUÐW\Ñ]Ô]Ð]ØØˆ
�3‰ˆàÐr   c                  óL   — 	 ddl m}   | ¦   «         pi S # t          $ r i cY S w xY w)zDLoad ~/.hermes/.env values without failing Docker command execution.r   ©Úload_env)Úhermes_cli.configr'   Ú	Exceptionr&   s    r   Ú_load_hermes_env_varsr*   [   sN   € ðØ.Ð.Ð.Ð.Ð.Ð.àˆx‰zŒzÐ˜RÐøÝð ð ð Øˆ	ˆ	ˆ	ðøøøs   ‚ ”#¢#c                  óx  — t           �t           S t          j        d¦  «        } | r]t          j                             | ¦  «        r>t          j        | t          j        ¦  «        r| a t                               d| ¦  «         | S t          j
        d¦  «        }|r|a |S t          j
        d¦  «        }|r|a t                               d|¦  «         |S t          D ]a}t          j                             |¦  «        r@t          j        |t          j        ¦  «        r!|a t                               d|¦  «         |c S ŒbdS )u‚  Locate the docker (or podman) CLI binary.

    Resolution order:
    1. ``HERMES_DOCKER_BINARY`` env var â€” explicit override (e.g. ``/usr/bin/podman``)
    2. ``docker`` on PATH via ``shutil.which``
    3. ``podman`` on PATH via ``shutil.which``
    4. Well-known macOS Docker Desktop install locations

    Returns the absolute path, or ``None`` if neither runtime can be found.
    NÚHERMES_DOCKER_BINARYz'Using HERMES_DOCKER_BINARY override: %sÚdockerÚpodmanz%Using podman as container runtime: %sz%Found docker at non-PATH location: %s)r   ÚosÚgetenvÚpathÚisfileÚaccessÚX_OKr   ÚinfoÚshutilÚwhichÚ_DOCKER_SEARCH_PATHS)ÚoverrideÚfoundr1   s      r   Úfind_dockerr;   e   s7  € õ Ð%Ý!Ð!õ ŒyÐ/Ñ0Ô0€HØð •B”G—N’N 8Ñ,Ô,ð µ´¸8ÅRÄWÑ1MÔ1Mð Ø%ÐÝ�ŠÐ=¸xÑHÔHÐHØˆõ ŒL˜Ñ"Ô"€EØð Ø"ÐØˆõ ŒL˜Ñ"Ô"€EØð Ø"ÐÝ�ŠÐ;¸UÑCÔCÐCØˆõ %ð ð ˆÝŒ7�>Š>˜$ÑÔð 	¥B¤I¨dµB´GÑ$<Ô$<ð 	Ø!%ÐÝ�KŠKÐ?ÀÑFÔFÐFØˆKˆKˆKøàˆ4r   )z
--cap-dropÚALLú	--cap-addÚDAC_OVERRIDEr=   ÚCHOWNr=   ÚFOWNERr=   ÚSETUIDr=   ÚSETGIDz--security-optzno-new-privilegesz--pids-limitÚ256ú--tmpfsz/tmp:rw,nosuid,size=512mrD   z#/var/tmp:rw,noexec,nosuid,size=256mrD   z/run:rw,noexec,nosuid,size=64mÚ_storage_opt_okc                  óˆ  — t          ¦   «         } | s)t                               d¦  «         t          d¦  «        ‚	 t	          j        | dgddd¬¦  «        }|j        dk    rHt                               d| |j        |j                             ¦   «         ¦  «         t          d	¦  «        ‚dS # t          $ r- t                               d
| d¬¦  «         t          d¦  «        ‚t          j
        $ r- t                               d| d¬¦  «         t          d¦  «        ‚t          $ r t                               dd¬¦  «         ‚ w xY w)zàBest-effort check that the docker CLI is available before use.

    Reuses ``find_docker()`` so this preflight stays consistent with the rest of
    the Docker backend, including known non-PATH Docker Desktop locations.
    z–Docker backend selected but no docker executable was found in PATH or known install locations. Install Docker Desktop and ensure the CLI is available.z|Docker executable not found in PATH or known install locations. Install Docker and ensure the 'docker' command is available.ÚversionTé   ©Úcapture_outputÚtextÚtimeoutr   zIDocker backend selected but '%s version' failed (exit code %d, stderr=%s)zXDocker command is available but 'docker version' failed. Check your Docker installation.zVDocker backend selected but the resolved docker executable '%s' could not be executed.)Úexc_infozHDocker executable could not be executed. Check your Docker installation.zYDocker backend selected but '%s version' timed out. The Docker daemon may not be running.zHDocker daemon is not responding. Ensure Docker is running and try again.z4Unexpected error while checking Docker availability.N)r;   r   ÚerrorÚRuntimeErrorÚ
subprocessÚrunÚ
returncodeÚstderrr   ÚFileNotFoundErrorÚTimeoutExpiredr)   )Ú
docker_exeÚresults     r   Ú_ensure_docker_availablerX   ¯   sÅ  € õ ‘”€JØð 	
Ý�Šð ñ	
ô 	
ð 	
õ
 ðKñ
ô 
ð 	
ð
-Ý”Ø˜Ð#ØØØð	
ñ 
ô 
ˆðB Ô Ò!Ð!Ý�LŠLð,àØÔ!Ø”×#Ò#Ñ%Ô%ñô ð õ ð2ñô ð ð "Ð!øõ7 ð 	
ð 	
ð 	
Ý�ŠðàØð	 	ñ 	
ô 	
ð 	
õ ØVñ
ô 
ð 	
õ Ô$ð 	
ð 	
ð 	
Ý�Šð4àØð	 	ñ 	
ô 	
ð 	
õ ØVñ
ô 
ð 	
õ ð ð ð Ý�ŠØBØð 	ñ 	
ô 	
ð 	
ð 	ðøøøs   »B* Â*BEc                   ó   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d"d	ed
ededededededededee         dz  de	dz  dededefˆ fd„Z
dee         fd„Zddddœdededededz  dej        f
d„Zedefd „¦   «         Zd!„ Zˆ xZS )#ÚDockerEnvironmentuñ  Hardened Docker container execution with resource limits and persistence.

    Security: all capabilities dropped, no privilege escalation, PID limits,
    size-limited tmpfs for scratch dirs. The container itself is the security
    boundary â€” the filesystem inside is writable so agents can install packages
    (pip, npm, apt) as needed. Writable workspace via tmpfs or bind mounts.

    Persistence: when enabled, bind mounts preserve /workspace and /root
    across container restarts.
    ú/rooté<   r   FÚdefaultNTÚimageÚcwdrL   ÚcpuÚmemoryÚdiskÚpersistent_filesystemÚtask_idÚvolumesr   r   ÚnetworkÚhost_cwdÚauto_mount_cwdc                 óL  •— |dk    rd}t          ¦   «                              ||¬¦  «         || _        || _        t	          |
¦  «        | _        t          |¦  «        | _        d | _        t           
                    d|	› �¦  «         |	�4t          |	t          ¦  «        st                               d|	›�¦  «         g }	t          ¦   «          g }|dk    r$|                     dt!          |¦  «        g¦  «         |dk    r|                     d|› d	�g¦  «         |dk    rZt"          j        d
k    rJ|                      ¦   «         r|                     dd|› d	�g¦  «         nt                               d¦  «         |s|                     d¦  «         ddlm} g }d}|	pg D ]Œ}t          |t           ¦  «        st                               d|›�¦  «         Œ5|                     ¦   «         }|sŒLd|v r|                     d|g¦  «         d|v rd}Œnt                               d|› d�¦  «         Œ�|r<t0          j                             t0          j                             |¦  «        ¦  «        nd}|o0t9          |¦  «        o!t0          j                             |¦  «        o| }|r>|r<t0          j                             |¦  «        st                               d|› �¦  «         d | _        d | _         g }| j        r· |¦   «         dz  |z  }t!          |dz  ¦  «        | _         t1          j!        | j         d¬¦  «         |                     d| j         › d�g¦  «         |sS|sQt!          |dz  ¦  «        | _        t1          j!        | j        d¬¦  «         |                     d| j        › d�g¦  «         n2|s|s|                     dd g¦  «         |                     g d!¢¦  «         |r't           
                    d"|› �¦  «         d|› d�g|¢}n|rt                               d#¦  «         	 dd$l"m#}m$}m%}  |¦   «         D ]S}|                     d|d%         › d|d&         › d'�g¦  «         t           
                    d(|d%         |d&         ¦  «         ŒT |¦   «         D ]S}|                     d|d%         › d|d&         › d'�g¦  «         t           
                    d)|d%         |d&         ¦  «         ŒT |¦   «         D ]S}|                     d|d%         › d|d&         › d'�g¦  «         t           
                    d*|d%         |d&         ¦  «         ŒTn2# tL          $ r%}t                               d+|¦  «         Y d }~nd }~ww xY wg }tO          | j        ¦  «        D ])} |                     d,| › d-| j        |          › �g¦  «         Œ*t           
                    d.|› �¦  «         t          tP          ¦  «        |z   |z   |z   |z   }!t           
                    d/|!› �¦  «         tS          ¦   «         pd| _*        d0tW          j,        ¦   «         j-        d d1…         › �}"| j*        d2d3d4d5|"d6|g|!¢|‘d7‘d8‘}#t                               d9d: .                    |#¦  «        › �¦  «         t_          j0        |#ddd;d¬<¦  «        }$|$j1                             ¦   «         | _        t           
                    d=|"› d>| j        d d?…         › d@�¦  «         |  2                    ¦   «         | _3        |  4                    ¦   «          d S )ANÚ~r[   )r_   rL   zDockerEnvironment volumes: z%docker_volumes config is not a list: r   z--cpusz--memoryÚmÚdarwinú--storage-optzsize=z�Docker storage driver does not support per-container disk limits (requires overlay2 on XFS with pquota). Container will run without disk quota.z--network=none)Úget_sandbox_dirFz%Docker volume entry is not a string: ú:z-vz:/workspaceTzDocker volume 'z' missing colon, skippingÚ z>Skipping docker cwd mount: host_cwd is not a valid directory: r-   Úhome)Úexist_okz:/rootÚ	workspacerD   z/workspace:rw,exec,size=10g)rD   z/home:rw,exec,size=1grD   z/root:rw,exec,size=1gz,Mounting configured host cwd to /workspace: zDSkipping docker cwd mount: /workspace already mounted by user config)Úget_credential_file_mountsÚget_skills_directory_mountÚget_cache_directory_mountsÚ	host_pathÚcontainer_pathz:roz$Docker: mounting credential %s -> %sz$Docker: mounting skills dir %s -> %sz#Docker: mounting cache dir %s -> %sz1Docker: could not load credential file mounts: %sú-eÚ=zDocker volume_args: zDocker run_args: zhermes-é   rQ   z-dz--initz--namez-wÚsleepÚinfinityzStarting container: Ú éx   )rJ   rK   rL   ÚcheckzStarted container z (é   ú))5ÚsuperÚ__init__Ú_persistentÚ_task_idr   Ú_forward_envr$   Ú_envÚ_container_idr   r5   r   Úlistr   rX   Úextendr   ÚsysÚplatformÚ_storage_opt_supportedr   Útools.environments.basern   r   r/   r1   ÚabspathÚ
expanduserr"   ÚisdirÚdebugÚ_workspace_dirÚ	_home_dirÚmakedirsÚtools.credential_filesrt   ru   rv   r)   ÚsortedÚ_SECURITY_ARGSr;   Ú_docker_exeÚuuidÚuuid4ÚhexÚjoinrP   rQ   ÚstdoutÚ_build_init_env_argsÚ_init_env_argsÚinit_session)&Úselfr^   r_   rL   r`   ra   rb   rc   rd   re   r   r   rf   rg   rh   Úresource_argsrn   Úvolume_argsÚworkspace_explicitly_mountedÚvolÚhost_cwd_absÚbind_host_cwdÚwritable_argsÚsandboxrt   ru   rv   Úmount_entryÚskills_mountÚcache_mountÚeÚenv_argsr   Úall_run_argsÚcontainer_nameÚrun_cmdrW   Ú	__class__s&                                        €r   r„   zDockerEnvironment.__init__ý   så  ø€ ð" �#Š:ˆ:ØˆCÝ‰Œ×Ò˜S¨'ÐÑ2Ô2Ð2Ø0ˆÔØˆŒÝ8¸ÑEÔEˆÔÝ'¨Ñ,Ô,ˆŒ	Ø,0ˆÔÝ�ŠÐ;°'Ð;Ð;Ñ<Ô<Ð<àÐ¥z°'½4Ñ'@Ô'@ÐÝ�NŠNÐNÀ7ÐNÐNÑOÔOÐOØˆGõ 	!Ñ"Ô"Ð"ð ˆØ�Š7ˆ7Ø× Ò  (­C°©H¬HÐ!5Ñ6Ô6Ð6Ø�AŠ:ˆ:Ø× Ò  *°¨l¨l¨lÐ!;Ñ<Ô<Ð<Ø�!Š8ˆ8�œ¨Ò0Ð0Ø×*Ò*Ñ,Ô,ð Ø×$Ò$ o°¸t°°°Ð%GÑHÔHÐHÐHå—’ðeñô ð ð ð 	3Ø× Ò Ð!1Ñ2Ô2Ð2ð
 	<Ð;Ð;Ð;Ð;Ð;ð ˆØ',Ð$Ø�M˜rð 	Qð 	QˆCÝ˜c¥3Ñ'Ô'ð Ý—’ÐNÀsÐNÐNÑOÔOÐOØØ—)’)‘+”+ˆCØð ØØ�cˆzˆzØ×"Ò" D¨# ;Ñ/Ô/Ð/Ø  CÐ'Ð'Ø37Ð0øå—’ÐO°ÐOÐOÐOÑPÔPÐPÐPàHPÐX•r”w—’¥r¤w×'9Ò'9¸(Ñ'CÔ'CÑDÔDÐDÐVXˆàð 1Ý�\Ñ"Ô"ð1å”—’˜lÑ+Ô+ð1ð 1Ð0ð	 	ð ð 	f˜hð 	f­r¬w¯}ª}¸\Ñ/JÔ/Jð 	fÝ�LŠLÐdÐZbÐdÐdÑeÔeÐeà-1ˆÔØ(,ˆŒØˆØÔð 	Ø%�oÑ'Ô'¨(Ñ2°WÑ<ˆGÝ  ¨6Ñ!1Ñ2Ô2ˆDŒNÝŒK˜œ°Ð6Ñ6Ô6Ð6Ø× Ò Ø˜œÐ/Ð/Ð/ð"ñ ô ð ð !ð Ð)Eð Ý&)¨'°KÑ*?Ñ&@Ô&@�Ô#Ý”˜DÔ/¸$Ð?Ñ?Ô?Ð?Ø×$Ò$Ø˜TÔ0Ð=Ð=Ð=ð&ñ ô ð øð !ð Ð)Eð Ø×$Ò$ØÐ<ð&ñ ô ð ð × Ò ð "ð "ð "ñ ô ð ð
 ð 	aÝ�KŠKÐUÀ|ÐUÐUÑVÔVÐVØ LÐ!=Ð!=Ð!=ÐLÀÐLˆKˆKØ)ð 	aÝ�LŠLÐ_Ñ`Ô`Ð`ð.	Qðð ð ð ð ð ð ð ð ð ð  :Ð9Ñ;Ô;ð 	ð 	�Ø×"Ò"ØØ" ;Ô/ÐTÐT°+Ð>NÔ2OÐTÐTÐTð$ñ ô ð õ —’Ø:Ø Ô,ØÐ 0Ô1ñô ð ð ð !;Ð :Ñ <Ô <ð 	ð 	�Ø×"Ò"ØØ# KÔ0ÐVÐV°<Ð@PÔ3QÐVÐVÐVð$ñ ô ð õ —’Ø:Ø  Ô-Ø Ð!1Ô2ñô ð ð ð  :Ð9Ñ;Ô;ð 	ð 	�Ø×"Ò"ØØ" ;Ô/ÐTÐT°+Ð>NÔ2OÐTÐTÐTð$ñ ô ð õ —’Ø9Ø Ô,ØÐ 0Ô1ñô ð ð ð	øõ ð 	Qð 	Qð 	QÝ�LŠLÐLÈaÑPÔPÐPÐPÐPÐPÐPÐPøøøøð	Qøøøð
 ˆÝ˜$œ)Ñ$Ô$ð 	?ð 	?ˆCØ�OŠO˜T cÐ#<Ð#<¨D¬I°c¬NÐ#<Ð#<Ð=Ñ>Ô>Ð>Ð>å�ŠÐ8¨;Ð8Ð8Ñ9Ô9Ð9Ý�NÑ+Ô+¨mÑ;¸mÑKÈkÑYÐ\dÑdˆÝ�ŠÐ6¨Ð6Ð6Ñ7Ô7Ð7õ '™=œ=Ð4¨HˆÔð :¥4¤:¡<¤<Ô#3°B°Q°BÔ#7Ð9Ð9ˆàÔ˜e TØØ�nØ�#ð	
ð
 ð
ð ð
ð ð
ð  ð
ˆõ 	�ŠÐ?¨C¯HªH°WÑ,=Ô,=Ð?Ð?Ñ@Ô@Ð@Ý”ØØØØØð
ñ 
ô 
ˆð $œ]×0Ò0Ñ2Ô2ˆÔÝ�ŠÐU¨ÐUÐU¸4Ô;MÈcÈrÈcÔ;RÐUÐUÐUÑVÔVÐVð
 #×7Ò7Ñ9Ô9ˆÔð 	×ÒÑÔÐÐÐs   Ð"D$U Õ
U6ÕU1Õ1U6r	   c                 ó  — t          | j        ¦  «        }t          | j        ¦  «        }t          ¦   «         }	 ddlm} t           |¦   «         ¦  «        }n# t          $ r Y nw xY w||t          z
  z  }|rt          ¦   «         ni }t          |¦  «        D ]4}t          j        |¦  «        }|€|                     |¦  «        }|�|||<   Œ5g }	t          |¦  «        D ]$}|	                     d|› d||         › �g¦  «         Œ%|	S )zîBuild -e KEY=VALUE args for injecting host env vars into init_session.

        These are used once during init_session() so that export -p captures
        them into the snapshot.  Subsequent execute() calls don't need -e flags.
        r   )Úget_all_passthroughNry   rz   )r   rˆ   r   r‡   Útools.env_passthroughr¶   r)   r   r*   r˜   r/   r0   Úgetr‹   )
r£   Úexec_envÚexplicit_forward_keysÚpassthrough_keysr¶   Úforward_keysÚ
hermes_envr   r#   Úargss
             r   r    z&DockerEnvironment._build_init_env_argsÎ  s>  € õ $(¨¬	¡?¤?ˆå # DÔ$5Ñ 6Ô 6ÐÝ%(¡U¤UÐð	ØAÐAÐAÐAÐAÐAÝ"Ð#6Ð#6Ñ#8Ô#8Ñ9Ô9ÐÐøÝð 	ð 	ð 	ØˆDð	øøøð
 -Ð0@ÕCaÑ0aÑbˆØ0<ÐDÕ*Ñ,Ô,Ð,À"ˆ
Ý˜,Ñ'Ô'ð 	&ð 	&ˆCÝ”I˜c‘N”NˆEØˆ}Ø"Ÿš sÑ+Ô+�ØÐ Ø %�˜‘øàˆÝ˜(Ñ#Ô#ð 	:ð 	:ˆCØ�KŠK˜ #Ð7Ð7¨°¬Ð7Ð7Ð8Ñ9Ô9Ð9Ð9Øˆs   ¸A Á
A#Á"A#r   )ÚloginrL   Ú
stdin_dataÚ
cmd_stringr¿   rÀ   c                óZ  — | j         s
J d¦   «         ‚| j        dg}|�|                     d¦  «         |r|                     | j        ¦  «         |                     | j         g¦  «         |r|                     ddd|g¦  «         n|                     dd|g¦  «         t          ||¦  «        S )z1Spawn a bash process inside the Docker container.zContainer not startedÚexecNz-iÚbashz-lz-c)r‰   rš   r   r‹   r¡   r   )r£   rÁ   r¿   rL   rÀ   Úcmds         r   Ú	_run_bashzDockerEnvironment._run_bashî  sÇ   € ð Ô!Ð:Ð:Ð#:Ñ:Ô:Ð!ØÔ Ð(ˆØÐ!Ø�JŠJ�tÑÔÐð ð 	,Ø�JŠJ�tÔ*Ñ+Ô+Ð+à�
Š
�DÔ&Ð'Ñ(Ô(Ð(àð 	3Ø�JŠJ˜  d¨JÐ7Ñ8Ô8Ð8Ð8à�JŠJ˜  jÐ1Ñ2Ô2Ð2å˜3 
Ñ+Ô+Ð+r   c                  ó  — t           �t           S 	 t          ¦   «         pd} t          j        | dddgddd¬¦  «        }|j                             ¦   «                              ¦   «         }|d	k    rd
a d
S t          j        | ddddgddd¬¦  «        }|j        dk    r8|j                             ¦   «         }|rt          j        | d|gdd¬¦  «         da nd
a n# t          $ r d
a Y nw xY wt           
                    dt           ¦  «         t           S )zìCheck if Docker's storage driver supports --storage-opt size=.
        
        Only overlay2 on XFS with pquota supports per-container disk quotas.
        Ubuntu (and most distros) default to ext4, where this flag errors out.
        Nr-   r5   z--formatz{{.Driver}}Té
   rI   Úoverlay2FÚcreaterm   zsize=1mzhello-worldé   r   ÚrmrH   )rJ   rL   z Docker --storage-opt support: %s)rE   r;   rP   rQ   rŸ   r   ÚlowerrR   r)   r   r“   )r-   rW   ÚdriverÚprobeÚcontainer_ids        r   rŽ   z(DockerEnvironment._storage_opt_supported  sR  € õ Ð&Ý"Ð"ð	$Ý ‘]”]Ð. hˆFÝ”^Ø˜ ¨]Ð;Ø#¨$¸ðñ ô ˆFð ”]×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2ˆFØ˜Ò#Ð#Ø"'�Ø�uõ ”NØ˜ ?°I¸}ÐMØ#¨$¸ðñ ô ˆEð Ô 1Ò$Ð$à$œ|×1Ò1Ñ3Ô3�Øð CÝ”N F¨D°,Ð#?Ø26ÀðCñ Cô Cð Cà"&��à"'�øøÝð 	$ð 	$ð 	$Ø#ˆOˆOˆOð	$øøøå�ŠÐ7½ÑIÔIÐIÝÐs   �AC Á1A"C ÃC#Ã"C#c           	      óì  — | j         rº	 d| j        › d| j         › d| j        › d| j         › d�	}t          j        |d¬¦  «         n8# t          $ r+}t
                               d| j         |¦  «         Y d	}~nd	}~ww xY w| j        s9	 t          j        d
| j        › d| j         › d�d¬¦  «         n# t          $ r Y nw xY wd	| _         | j        s)| j        | j	        fD ]}|rt          j        |d¬¦  «         Œd	S d	S )zJStop and remove the container. Bind-mount dirs persist if persistent=True.z(timeout 60 z stop z || z rm -f z) >/dev/null 2>&1 &T)ÚshellzFailed to stop container %s: %sNzsleep 3 && z >/dev/null 2>&1 &)Úignore_errors)r‰   rš   rP   ÚPopenr)   r   r   r…   r”   r•   r6   Úrmtree)r£   Ústop_cmdr¯   Úds       r   ÚcleanupzDockerEnvironment.cleanup-  s¢  € àÔð 	&ðYðX 4Ô#3ð Xð X¸4Ô;Mð Xð XØÔ'ðXð XØ04Ô0BðXð Xð Xð õ Ô  °Ð6Ñ6Ô6Ð6Ð6øÝð Yð Yð YÝ—’Ð@À$ÔBTÐVWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøð Ô#ð ðÝÔ$Øe dÔ&6ÐeÐe¸tÔ?QÐeÐeÐeØ"ðñ ô ð ð øõ !ð ð ð Ø�Dðøøøà!%ˆDÔàÔð 	9ØÔ)¨4¬>Ð:ð 9ð 9�Øð 9Ý”M !°4Ð8Ñ8Ô8Ð8øð	9ð 	9ð9ð 9s)   ‰9A Á
A8Á!A3Á3A8Â'B+ Â+
B8Â7B8)r[   r\   r   r   r   Fr]   NNNTNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r!   r"   rŠ   r   r„   r    rP   rÔ   rÆ   ÚstaticmethodrŽ   rØ   Ú__classcell__)r´   s   @r   rZ   rZ   ñ   sÐ  ø€ € € € € ð	ð 	ð ØØØØØ&+Ø ØØ(,ØØØØ$ðOð OàðOð ðOð ð	Oð
 ðOð ðOð ðOð  $ðOð ðOð ðOð ˜#”Y Ñ%ðOð �D‰[ðOð ðOð ðOð ðOð Oð Oð Oð Oð Oðb d¨3¤ið ð ð ð ð@ ;@Ø!$Ø+/ð,ð ,ð , Cð ,°4ð ,Øð,à! D™jð,à4>Ô4Dð,ð ,ð ,ð ,ð. ð% Dð %ð %ð %ñ „\ð%ðN9ð 9ð 9ð 9ð 9ð 9ð 9r   rZ   )r	   N)#rÜ   Úloggingr/   Úrer6   rP   rŒ   r›   Útypingr   r�   r   r   Útools.environments.localr   Ú	getLoggerrÙ   r   r8   r   r   Ú__annotations__Úcompiler   rŠ   r   r   r$   r*   r;   r™   rE   r"   rX   rZ   © r   r   ú<module>rç      sü  ððð ð ð €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø CÐ CÐ CÐ CÐ CÐ Cà	ˆÔ	˜8Ñ	$Ô	$€ðð ð Ð ð %)Ð �H˜S”MÐ (Ð (Ñ (Ø�2”:Ð9Ñ:Ô:Ð ð¨d°3¬i¸$Ñ.>ð À4ÈÄ9ð ð ð ð ð2˜T D™[ð ¨T°#°s°(¬^ð ð ð ð ð<˜t C¨ Hœ~ð ð ð ð ð*�X˜c”]ð *ð *ð *ð *ðpð ð €ð #'€�˜$”Ð &Ð &Ñ &ð?ð ?ð ?ð ?ðDW9ð W9ð W9ð W9ð W9˜ñ W9ô W9ð W9ð W9ð W9r   