
    *Ce                     r    d Z ddlZddlZddlZddlZddlZ G d de      Z G d de      Z	 G d de      Z
y)	z
Terminal / input handling
    Nc                   F    e Zd ZdZd Zd Zd Zd Zd ZddZ	dd	Z
dd
Zy)Terminalz@
    Do minimal terminal mangling to prompt users for input
    c                 N    || _         d | _        d | _        | j                          y N)fd
orig_flags	orig_termsave)selfr   s     */usr/share/netplan/netplan_cli/terminal.py__init__zTerminal.__init__"   s     		    c                 B   t         j                  j                         rt        j                  | j
                        }|d   t        j                  z  |d<   |d   t        j                  z  |d<   t        j                  | j
                  t        j                  |       y y N   
sysstdinisattytermios	tcgetattrr   ICANONECHO	tcsetattrTCSANOWr   attrss     r   enable_echozTerminal.enable_echo(   sq    99%%dgg.EQx'..0E!HQx',,.E!Hdggw>	 r   c                 F   t         j                  j                         rt        j                  | j
                        }|d   t        j                   z  |d<   |d   t        j                   z  |d<   t        j                  | j
                  t        j                  |       y y r   r   r   s     r   disable_echozTerminal.disable_echo/   su    99%%dgg.EQx7>>/1E!HQx7<<-/E!Hdggw>	 r   c                     t        j                   | j                  t         j                        }t        j                   | j                  t         j                  |t        j
                  z         y r   fcntlr   F_GETFLF_SETFLos
O_NONBLOCKr   flagss     r   enable_nonblocking_iozTerminal.enable_nonblocking_io6   s;    DGGU]]3DGGU]]EBMM,ABr   c                     t        j                   | j                  t         j                        }t        j                   | j                  t         j                  |t        j
                   z         y r   r"   r(   s     r   disable_nonblocking_iozTerminal.disable_nonblocking_io:   s=    DGGU]]3DGGU]]ER]]N,BCr   Nc           
      n   t        d       t               }| j                  |       | j                          | j	                          |sd}t        dj                  |             |}|dkD  rt        dj                  |t        t        |                  d       t        j                  t        j                  gg g d       	 t        j                  j                         }|d	k(  r| j                  |       t               	 |dz  }|dkD  r| j                  |       t               # t        $ r Y 1w xY w)
a  
        Get a "confirmation" input from the user, for at most (timeout)
        seconds. Optionally, customize the message to be displayed.

        timeout -- timeout to wait for input (default 120)
        message -- optional customized message ("Press ENTER to (message)")

        raises:
        InputAccepted -- the user confirmed the changes
        InputRejected -- the user rejected the changes
        z%Do you want to keep these settings?

zaccept the new configurationz&Press ENTER before the timeout to {}

r   z%Changes will revert in {:>{}} seconds)end   
)printdictr
   r    r*   formatlenstrselectr   r   readresetInputAccepted	TypeErrorInputRejected)r   timeoutmessagesettingstimeout_nowcs         r   get_confirmation_inputzTerminal.get_confirmation_input>   s    	786		(""$4G8??HIQ9@@cRUV]R^N_`fjk MM399+r2q1 IINN$IJJx('/)  1K% Q. 	

8o   	s   >D( (	D43D4c                 (   t        j                   | j                  t         j                        }d}t        j                  j                         rt        j                  | j                        }||j                  ||d       y|| _	        || _
        y)z
        Save the terminal's current attributes and flags

        Optional argument:
            - dest: if set, save settings to this dict
        N)r)   term)r#   r   r$   r   r   r   r   r   updater   r	   )r   destr   r	   s       r   r
   zTerminal.savep   sq     [[%--8
	99))$''2IKK*!*, - )DO&DNr   c                 ~   d}d}|#|j                  d      }|j                  d      }n| j                  }| j                  }t        j                  j                         r/t        j                  | j                  t        j                  |       t        j                  | j                  t        j                  |       y)z
        Reset the terminal to its original attributes and flags

        Optional argument:
            - orig: if set, reset to settings from this dict
        NrD   r)   )getr	   r   r   r   r   r   r   r   	TCSAFLUSHr#   r%   )r   origr	   r   s       r   r9   zTerminal.reset   s     	
(I'*JIJ99dggw'8'8)DDGGU]]J7r   )x   Nr   )__name__
__module____qualname____doc__r   r   r    r*   r,   rB   r
   r9    r   r   r   r      s2    ??CD0d'$8r   r   c                       e Zd ZdZy)r:   z Denotes has accepted inputNrL   rM   rN   rO   rP   r   r   r:   r:      s    %r   r:   c                       e Zd ZdZy)r<   z) Denotes that the user has rejected inputNrR   rP   r   r   r<   r<      s    3r   r<   )rO   r#   r&   r   r7   r   objectr   	Exceptionr:   r<   rP   r   r   <module>rV      sB   $  	   
v8v v8r	I 	
	I 	r   