
    Vhf                         d dl mZmZmZ eZdZd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mZ d dlmZ d d	lmZmZ  G d
 de      Zd Z G d de      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functionaU  
module: homebrew_cask
author:
  - "Indrajit Raychaudhuri (@indrajitr)"
  - "Daniel Jaouen (@danieljaouen)"
  - "Enric Lluelles (@enriclluelles)"
short_description: Install and uninstall homebrew casks
description:
  - Manages Homebrew casks.
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  name:
    description:
      - Name of cask to install or remove.
    aliases: ['cask', 'package', 'pkg']
    type: list
    elements: str
  path:
    description:
      - "':' separated list of paths to search for 'brew' executable."
    default: '/usr/local/bin:/opt/homebrew/bin'
    type: path
  state:
    description:
      - State of the cask.
    choices: ['absent', 'installed', 'latest', 'present', 'removed', 'uninstalled', 'upgraded']
    default: present
    type: str
  sudo_password:
    description:
      - The sudo password to be passed to E(SUDO_ASKPASS).
    required: false
    type: str
  update_homebrew:
    description:
      - Update homebrew itself first.
      - Note that C(brew cask update) is a synonym for C(brew update).
    type: bool
    default: false
  install_options:
    description:
      - Options flags to install a package.
    aliases: ['options']
    type: list
    elements: str
  accept_external_apps:
    description:
      - Allow external apps.
    type: bool
    default: false
  upgrade_all:
    description:
      - Upgrade all casks.
      - Mutually exclusive with C(upgraded) state.
    type: bool
    default: false
    aliases: ['upgrade']
  greedy:
    description:
      - Upgrade casks that auto update.
      - Passes C(--greedy) to C(brew outdated --cask) when checking if an installed cask has a newer version available, or
        to C(brew upgrade --cask) when upgrading all casks.
    type: bool
    default: false
a  
- name: Install cask
  community.general.homebrew_cask:
    name: alfred
    state: present

- name: Remove cask
  community.general.homebrew_cask:
    name: alfred
    state: absent

- name: Install cask with install options
  community.general.homebrew_cask:
    name: alfred
    state: present
    install_options: 'appdir=/Applications'

- name: Install cask with install options
  community.general.homebrew_cask:
    name: alfred
    state: present
    install_options: 'debug,appdir=/Applications'

- name: Install cask with force option
  community.general.homebrew_cask:
    name: alfred
    state: present
    install_options: force

- name: Allow external app
  community.general.homebrew_cask:
    name: alfred
    state: present
    accept_external_apps: true

- name: Remove cask with force option
  community.general.homebrew_cask:
    name: alfred
    state: absent
    install_options: force

- name: Upgrade all casks
  community.general.homebrew_cask:
    upgrade_all: true

- name: Upgrade all casks with greedy option
  community.general.homebrew_cask:
    upgrade_all: true
    greedy: true

- name: Upgrade given cask with force option
  community.general.homebrew_cask:
    name: alfred
    state: upgraded
    install_options: force

- name: Upgrade cask with greedy option
  community.general.homebrew_cask:
    name: 1password
    state: upgraded
    greedy: true

- name: Using sudo password for installing cask
  community.general.homebrew_cask:
    name: wireshark
    state: present
    sudo_password: "{{ ansible_become_pass }}"
N)LooseVersion)HomebrewValidate)to_bytes)AnsibleModule)	iteritemsstring_typesc                       e Zd Zy)HomebrewCaskExceptionN)__name__
__module____qualname__     s/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/homebrew_cask.pyr   r      s    r   r   c                     d | j                  d      D        }t        d d |D              }ddj                  |      z   dz   }t        j                  |      S )Nc              3   ^   K   | ]%  }|j                         s|j                          ' y wN)strip.0lines     r   	<genexpr>z1_create_regex_group_complement.<locals>.<genexpr>   s     Ddtzz|TZZ\Ds   --
c              3   `   K   | ]&  }|j                  d       d   j                          ( yw)#r   N)splitr   r   s     r   r   z1_create_regex_group_complement.<locals>.<genexpr>   s&     G$**S/!,224Gs   ,.z[^ ])r   filterjoinrecompile)slinescharsgroups       r   _create_regex_group_complementr*      sL    DaggdmDE4GGHECHHUO#d*E::er   c            	          e Zd ZdZdZ ee      Zed        Zed        Z	ed        Z
ed        Zej                  d        Zed        Zej                  d	        Zed
        Zej                  d        Zed        Zej                  d        Zed        Zej                  d        Zed        Zej                  d        Zeddddddddf	dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Z d" Z!d# Z"d$ Z#d% Z$d& Z%d' Z&d( Z'y))HomebrewCaskz!A class to manage Homebrew casks.a  
        \w                  # alphanumeric characters (i.e., [a-zA-Z0-9_])
        .                   # dots
        /                   # slash (for taps)
        \-                  # dashes
        @                   # at symbol
        \+                  # plus symbol
    c                 d    |yt        |t              xr | j                  j                  |       S )z:A valid cask is either None or alphanumeric + backslashes.T)
isinstancer   INVALID_CASK_REGEXsearch)clscasks     r   
valid_caskzHomebrewCask.valid_cask   s9     < t\* 8**11$77	
r   c                 P    |yt        |t              xr |j                         dv S )zW
        A valid state is one of:
            - installed
            - absent
        T)	installedabsent)r.   r   lower)r1   states     r   valid_statezHomebrewCask.valid_state   s5     = 5,/ KKM & r   c                 "    t        |t              S )z/A valid module is an instance of AnsibleModule.)r.   r	   )r1   modules     r   valid_modulezHomebrewCask.valid_module   s     &-00r   c                     | j                   S r   )_moduleselfs    r   r;   zHomebrewCask.module       ||r   c                     | j                  |      s9d | _        d| _        dj                  |      | _        t        | j                        || _        |S )NTzInvalid module: {0}.)r<   r>   failedformatmessager   )r@   r;   s     r   r;   zHomebrewCask.module   sM      (DLDK188@DL'55 "DLMr   c                     | j                   S r   )_pathr?   s    r   pathzHomebrewCask.path   s    zzr   c                     t        j                  |      s9g | _        d| _        dj	                  |      | _        t        | j
                        t        |t              r|j                  d      | _        |S || _        |S )NTzInvalid path: {0}.:)
r   
valid_pathrG   rC   rD   rE   r   r.   r   r   )r@   rH   s     r   rH   zHomebrewCask.path  so    **40DJDK/66t<DL'55 $-!ZZ_
 K "
Kr   c                     | j                   S r   )
_brew_pathr?   s    r   	brew_pathzHomebrewCask.brew_path  s    r   c                     t        j                  |      s9d | _        d| _        dj	                  |      | _        t        | j
                        || _        |S )NTzInvalid brew_path: {0}.)r   valid_brew_pathrM   rC   rD   rE   r   )r@   rN   s     r   rN   zHomebrewCask.brew_path  sN    //	:"DODK4;;IFDL'55 (DOr   c                     | j                   S r   )_paramsr?   s    r   paramszHomebrewCask.params!  rA   r   c                 P    | j                   j                  | _        | j                  S r   )r;   rS   rR   )r@   rS   s     r   rS   zHomebrewCask.params%  s    {{))||r   c                     | j                   S r   )_current_caskr?   s    r   current_caskzHomebrewCask.current_cask*  s    !!!r   c                     | j                  |      s9d | _        d| _        dj                  |      | _        t        | j                        || _        |S )NTInvalid cask: {0}.)r3   rV   rC   rD   rE   r   r@   r2   s     r   rW   zHomebrewCask.current_cask.  sM    t$!%DDK/66t<DL'55 "&DKr   c                 :    	 | j                   S # t        $ r Y y w xY wr   )_brew_versionAttributeErrorr?   s    r   brew_versionzHomebrewCask.brew_version:  s%    	%%% 		s    	c                     || _         y r   )r\   )r@   r^   s     r   r^   zHomebrewCask.brew_versionA  s
    )r   NFc                     |s
t               }| j                          | j                  |||||||||	|

       | j                          y )N
r;   rH   casksr8   sudo_passwordupdate_homebrewinstall_optionsaccept_external_appsupgrade_allgreedy)list_setup_status_vars_setup_instance_vars_prep)r@   r;   rH   rb   r8   rc   rd   re   rf   rg   rh   s              r   __init__zHomebrewCask.__init__G  sR     "fO!!!d%(-]2A2A7K.9)/ 	" 	3 	

r   c                 J    d| _         d| _        d| _        d| _        d| _        y )NFr   r    )rC   changedchanged_countunchanged_countrE   r?   s    r   rj   zHomebrewCask._setup_status_varsY  s'     r   c                 D    t        |      D ]  \  }}t        | ||        y r   )r
   setattr)r@   kwargskeyvals       r   rk   z!HomebrewCask._setup_instance_vars`  s&    !&) 	$HCD#s#	$r   c                 $    | j                          y r   )_prep_brew_pathr?   s    r   rl   zHomebrewCask._prepd  s    r   c                 8   | j                   s*d | _        d| _        d| _        t	        | j                        | j                   j                  dd| j                        | _        | j                  s d | _        d| _        d| _        t	        d      | j                  S )NTzAnsibleModule not set.brew)requiredopt_dirsz%Unable to locate homebrew executable.)r;   rN   rC   rE   r   get_bin_pathrH   r?   s    r   rx   zHomebrewCask._prep_brew_pathg  s    {{!DNDK3DL'5511YY 2 

 ~~!DNDKBDL'(OPP~~r   c                 H    | j                   | j                  | j                  fS r   )rC   ro   rE   r?   s    r   _statuszHomebrewCask._status{  s    T\\4<<88r   c                    	 | j                          | j                  s<| j                  | j                  z   dkD  r d| j                  | j                  fz  | _        | j                         \  }}}|||fS # t        $ r Y lw xY w)N   zChanged: %d, Unchanged: %d)_runr   rC   rp   rq   rE   r   )r@   rC   ro   rE   s       r   runzHomebrewCask.run  s    	IIK {{ 2 2T5I5I IA M7""$$; DL &*\\^"')) % 		s   A3 3	A?>A?c                 $   | j                  | j                        sy| j                         r| j                  ddg}n| j                  ddg}|| j                  rdgng z   | j                  gz   }| j
                  j                  |      \  }}}|dk7  S )NFoutdated--caskr2   --greedyr    )r3   rW    _brew_cask_command_is_deprecatedrN   rh   r;   run_command)r@   	base_optscask_is_outdated_commandrcouterrs         r   _current_cask_is_outdatedz&HomebrewCask._current_cask_is_outdated  s    t001002X>I<I#,QS#TX\XiXiWj#j {{../GHCbyr   c                 v   | j                  | j                        s<d| _        dj                  | j                        | _        t        | j                        | j                         r| j                  ddg}n| j                  ddg}|| j                  gz   }| j                  j                  |      \  }}}|dk(  S )NTrY   ri   r   r2   r   )
r3   rW   rC   rD   rE   r   r   rN   r;   r   )r@   r   cmdr   r   r   s         r   _current_cask_is_installedz'HomebrewCask._current_cask_is_installed  s    t001DK/66t7H7HIDL'55002:I8I4,,--{{..s3CQwr   c                 F   | j                   r| j                   S | j                  dg}| j                  j                  |d      \  }}}d}t	        j
                  ||      }|s| j                  j                  d|       |j                         d   | _         | j                   S )Nz	--versionT)check_rcz%Homebrew (.*)(\d+\.\d+\.\d+)(-dirty)?z)Failed to match regex to get brew version)msgstdoutr   )r^   rN   r;   r   r$   r0   	fail_jsongroups)r@   r   dummyr   patternrematchs         r   _get_brew_versionzHomebrewCask._get_brew_version  s    $$$~~{+ KK33C$3GsE:))GS)KK!!&QZ]!^#NN,Q/   r   c                 L    t        | j                               t        d      k\  S )Nz2.6.0)r   r   r?   s    r   r   z-HomebrewCask._brew_cask_command_is_deprecated  s     D2245g9NNNr   c                 R   | j                   r| j                         S | j                  r]| j                  dk(  r| j	                         S | j                  dk(  r| j                         S | j                  dk(  r| j                         S d| _        d| _        t        | j                        )Nr5   upgradedr6   Tz"You must select a cask to install.)
rg   _upgrade_allrb   r8   _install_casks_upgrade_casks_uninstall_casksrC   rE   r   r?   s    r   r   zHomebrewCask._run  s    $$&&::zz[(**,,z)**,,x',,..;#DLL11r   c                    d\  }}}t        j                         5 }|j                  dt        | j                        z         t        j                  |j                  d       |j                  j                          | j                  j                  |d|j                  i      \  }}}| j                  j                  |j                         d d d        |||fS # 1 sw Y   xY w)Nr    r    r    s   #!/bin/sh

echo '%s'
i  SUDO_ASKPASS)environ_update)tempfileNamedTemporaryFilewriter   rc   oschmodnamefilecloser;   r   add_cleanup_file)r@   r   r   r   r   sudo_askpass_files         r   _run_command_with_sudo_passwordz,HomebrewCask._run_command_with_sudo_password  s    !C((* 
	A.?##$?(4K]K]B^$^_HH&++U3""((*;;22 .0A0F0FG 3 LBS
 KK(():)?)?@
	A C~
	A 
	As   B4CC%c                 \   | j                   j                  | j                  dg      \  }}}|dk(  rL|rIt        |t              r9t        d |j                  d      D              }|sd| _        d| _        yd| _        yd| _	        |j                         | _        t        | j                        )Nupdater   c              3      K   | ]9  }|r5t        j                  d |j                         t         j                         ; yw)zAlready up-to-date.N)r$   r0   r   
IGNORECASE)r   r&   s     r   r   z0HomebrewCask._update_homebrew.<locals>.<genexpr>  s3      & II4aggiO&s   ?Ar   TzHomebrew updated successfully.zHomebrew already up-to-date.)r;   r   rN   r.   r   anyr   ro   rE   rC   r   r   )r@   r   r   r   already_updateds        r   _update_homebrewzHomebrewCask._update_homebrew  s    {{..NN0
 C 7z#|4"% & YYt_& #
 '#'DL#CDL  $BDLDK99;DL'55r   c                    | j                   j                  r#d| _        d| _        t	        | j                        | j                         r| j                  ddg}n| j                  ddg}| j                  r|dgz   }d\  }}}| j                  r| j                  |      \  }}}n| j                   j                  |      \  }}}|dk(  rb|j                         sd	| _        yt        j                  d
|j                         t        j                        rd	| _        yd| _        d| _        yd| _        |j                         | _        t	        | j                        )NTzCasks would be upgraded.upgrader   r2   r   r   r   z Homebrew casks already upgraded.z==> No Casks to upgradezHomebrew casks upgraded.)r;   
check_modero   rE   r   r   rN   rh   rc   r   r   r   r$   r0   r   rC   )r@   r   r   r   r   s        r   r   zHomebrewCask._upgrade_all  s*   ;;!!DL5DL'55002>>9h7C>>695C;;$C!C??DLBS;;2237LBS799;A  5syy{BMMRA   $9DK99;DL'55r   c                    | j                  | j                        s<d| _        dj                  | j                        | _        t        | j                        d| j                  vrF| j                         r6| xj                  dz  c_        dj                  | j                        | _        y| j                  j                  r<d| _        dj                  | j                        | _        t        | j                        | j                         r| j                  ddg}n| j                  d	dg}|| j                  gz   | j                  z   }|D cg c]  }|s|	 }}d
\  }}}| j                  r| j                  |      \  }}}n| j                  j!                  |      \  }}}| j                         r=| xj"                  dz  c_        d| _        dj                  | j                        | _        y| j$                  rLt'        j(                  d|      r6| xj                  dz  c_        dj                  | j                        | _        yd| _        |j+                         | _        t        | j                        c c}w )NTrY   z--forcer   zCask already installed: {0}zCask would be installed: {0}installr   r2   r   zCask installed: {0}z*Error: It seems there is already an App at)r3   rW   rC   rD   rE   r   re   r   rq   r;   r   ro   r   rN   rc   r   r   rp   rf   r$   r0   r   r@   r   optsoptr   r   r   r   s           r   _install_current_caskz"HomebrewCask._install_current_cask+  s   t001DK/66t7H7HIDL'55D000T5T5T5V  A% 8??!!DL ;;!!DL9@@!!DL (55002H=I;ID--..1E1EE"*scs**!C??DLBS;;2237LBS**,!#DL0778I8IJDL&&2995bdg+h  A% 8??!!DL DK99;DL'55/ +s   I9I9c                 T    | j                   D ]  }|| _        | j                           yNT)rb   rW   r   rZ   s     r   r   zHomebrewCask._install_casks_  .    JJ 	)D $D&&(	) r   c                    d}| j                  | j                        s<d| _        dj                  | j                        | _        t        | j                        | j                         sd}| j                         rF| j                         s6dj                  | j                        | _        | xj                  dz  c_        y| j                  j                  r<d| _        dj                  | j                        | _        t        | j                        | j                         r| j                  |dg}n| j                  d	|g}|| j                  z   | j                  gz   }|D cg c]  }|s|	 }}d
\  }}}| j                  r| j!                  |      \  }}}n| j                  j#                  |      \  }}}| j                         rM| j                         s=| xj$                  dz  c_        d| _        dj                  | j                        | _        yd| _        |j'                         | _        t        | j                        c c}w )Nr   TrY   r   zCask is already upgraded: {0}r   zCask would be upgraded: {0}r   r2   r   zCask upgraded: {0})r3   rW   rC   rD   rE   r   r   r   rq   r;   r   ro   r   rN   re   rc   r   r   rp   r   )	r@   commandr   r   r   r   r   r   r   s	            r   _upgrade_current_caskz"HomebrewCask._upgrade_current_caskh  s   t001DK/66t7H7HIDL'55..0G**,T5S5S5U:AA!!DL   A% ;;!!DL8??!!DL (55002(;I9I4///43D3D2EE"*scs**!C??DLBS;;2237LBS**,T5S5S5U!#DL/66t7H7HIDLDK99;DL'55# +s   $I,Ic                 T    | j                   D ]  }|| _        | j                           yr   )rb   rW   r   rZ   s     r   r   zHomebrewCask._upgrade_casks  r   r   c                 0   | j                  | j                        s<d| _        dj                  | j                        | _        t        | j                        | j                         s6| xj                  dz  c_        dj                  | j                        | _        y| j                  j                  r<d| _
        dj                  | j                        | _        t        | j                        | j                         r| j                  ddg}n| j                  ddg}|| j                  gz   | j                  z   }|D cg c]  }|s|	 }}d	\  }}}| j                  r| j                  |      \  }}}n| j                  j!                  |      \  }}}| j                         s=| xj"                  dz  c_        d| _
        d
j                  | j                        | _        yd| _        |j%                         | _        t        | j                        c c}w )NTrY   r   zCask already uninstalled: {0}zCask would be uninstalled: {0}	uninstallr   r2   r   zCask uninstalled: {0})r3   rW   rC   rD   rE   r   r   rq   r;   r   ro   r   rN   re   rc   r   r   rp   r   r   s           r   _uninstall_current_caskz$HomebrewCask._uninstall_current_cask  s   t001DK/66t7H7HIDL'55..0  A% :AA!!DL ;;!!DL;BB!!DL (55002h?I=ID--..1E1EE"*scs**!C??DLBS;;2237LBS..0!#DL299$:K:KLDLDK99;DL'55# +s    HHc                 T    | j                   D ]  }|| _        | j                           yr   )rb   rW   r   rZ   s     r   r   zHomebrewCask._uninstall_casks  s.    JJ 	+D $D((*	+ r   )(r   r   r   __doc__VALID_CASK_CHARSr*   r/   classmethodr3   r9   r<   propertyr;   setterrH   rN   rS   rW   r^   rm   rj   rk   rl   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r,      s   + 88HI 	
 	
  $ 1 1   ]]	 	   
[[    	 	   ]]  " " 	 	   * *
 %)D#U!%E"5$$(9*  !O2"&64&6T26h16f,6\r   r,   c                     t        t        t        g dddd      t        ddd      t        d	g d
      t        ddd      t        dd      t        d dgdd      t        dd      t        ddgd      t        dd      	      d      } t        dddd      | _        | j                  }|d   r|d   }nd }|d   }|r|j	                  d      }|d   }|dv rd}|dv rd}|dv rd }|d!   }|d"   }|d#   }|d$   }|d%   xs g |d%<   |d%   D 	cg c]  }	d&j                  |	       }
}	|d'   }t        | ||||||
|||(
      }|j                         \  }}}|r| j                  |)       y | j                  ||*       y c c}	w )+N)pkgpackager2   Fri   str)aliasesr{   typeelementsz /usr/local/bin:/opt/homebrew/binrH   )defaultr{   r   present)r   r5   latestr   r6   removeduninstalled)r   choicesT)r   r{   no_logbool)r   r   options)r   r   r   r   r   )r   r   r   )	r   rH   r8   rc   rd   re   rf   rg   rh   )argument_specsupports_check_modeC)LANGLC_ALLLC_MESSAGESLC_CTYPEr   rJ   r8   )r   r5   r5   )r   r   r   )r6   r   r   r6   rc   rd   rg   rh   re   z--{0}rf   ra   )r   )ro   r   )
r	   dictrun_command_environ_updaterS   r   rD   r,   r   r   	exit_json)r;   prb   rH   r8   rc   rd   rg   rh   install_optionre   rf   	brew_caskrC   ro   rE   s                   r   mainr     s&   2	 :
 ! 
 ! !"	 "&" "
 Y0
b !e3Fj )-#cs]`(aF%Ay&	V9Dzz#gJE((&&44o&M)*OM"Kx[F./52A-./@-AC) ~~n5 CO C 34FU#(-<-<2F)4$*I "+VWgW%g6#Cs   F__main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESr   r$   r   Bansible_collections.community.general.plugins.module_utils.versionr   Cansible_collections.community.general.plugins.module_utils.homebrewr   +ansible.module_utils.common.text.convertersr   ansible.module_utils.basicr	   ansible.module_utils.sixr
   r   	Exceptionr   r*   objectr,   r   r   r   r   r   <module>r      sz    A @FNCJ 
 	  [ ` @ 4 <	I 	b6 bNb7J zF r   