
    VhH                         d dl mZmZmZ eZdZdZd dlm	Z	 d dl
Z
d dlm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edk(  r e        yy)    )absolute_importdivisionprint_functiona  
module: pkgng
short_description: Package manager for FreeBSD >= 9.0
description:
  - Manage binary packages for FreeBSD using C(pkgng) which is available in versions after 9.0.
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  name:
    description:
      - Name or list of names of packages to install/remove.
      - With O(name=*), O(state=latest) will operate, but O(state=present) and O(state=absent) will be noops.
    required: true
    aliases: [pkg]
    type: list
    elements: str
  state:
    description:
      - State of the package.
    choices: ['present', 'latest', 'absent']
    required: false
    default: present
    type: str
  cached:
    description:
      - Use local package base instead of fetching an updated one.
    type: bool
    required: false
    default: false
  annotation:
    description:
      - A list of keyvalue-pairs of the form C(<+/-/:><key>[=<value>]). A V(+) denotes adding an annotation, a V(-) denotes
        removing an annotation, and V(:) denotes modifying an annotation. If setting or modifying annotations, a value must
        be provided.
    required: false
    type: list
    elements: str
  pkgsite:
    description:
      - For C(pkgng) versions before 1.1.4, specify C(packagesite) to use for downloading packages. If not specified, use
        settings from C(/usr/local/etc/pkg.conf).
      - For newer C(pkgng) versions, specify a the name of a repository configured in C(/usr/local/etc/pkg/repos).
    required: false
    type: str
  rootdir:
    description:
      - For C(pkgng) versions 1.5 and later, pkg will install all packages within the specified root directory.
      - Can not be used together with O(chroot) or O(jail) options.
    required: false
    type: path
  chroot:
    description:
      - Pkg will chroot in the specified environment.
      - Can not be used together with O(rootdir) or O(jail) options.
    required: false
    type: path
  jail:
    description:
      - Pkg will execute in the given jail name or ID.
      - Can not be used together with O(chroot) or O(rootdir) options.
    type: str
  autoremove:
    description:
      - Remove automatically installed packages which are no longer needed.
    required: false
    type: bool
    default: false
  ignore_osver:
    description:
      - Ignore FreeBSD OS version check, useful on C(-STABLE) and C(-CURRENT) branches.
      - Defines the E(IGNORE_OSVERSION) environment variable.
    required: false
    type: bool
    default: false
    version_added: 1.3.0
  use_globs:
    description:
      - Treat the package names as shell glob patterns.
    required: false
    type: bool
    default: true
    version_added: 9.3.0
author: "bleader (@bleader)"
notes:
  - When using pkgsite, be careful that already in cache packages will not be downloaded again.
  - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly
    to the O(name) option.
a  
- name: Install package foo
  community.general.pkgng:
    name: foo
    state: present

- name: Annotate package foo and bar
  community.general.pkgng:
    name:
      - foo
      - bar
    annotation: '+test1=baz,-test2,:test3=foobar'

- name: Remove packages foo and bar
  community.general.pkgng:
    name:
      - foo
      - bar
    state: absent

- name: Upgrade package baz
  community.general.pkgng:
    name: baz
    state: latest

- name: Upgrade all installed packages (see warning for the name option first!)
  community.general.pkgng:
    name: "*"
    state: latest

- name: Upgrade foo/bar
  community.general.pkgng:
    name: foo/bar
    state: latest
    use_globs: false
)defaultdictN)AnsibleModulec                 (     |dd|      \  }}}|dk(  S )Ninfoz-er    module	run_pkgngnamercouterrs         k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/pkgng.pyquery_packager      s    VT40LBS7N    c                 (     |dd|      \  }}}|dk(  S )Nupgrade-n   r
   r   s         r   query_updater      s!    
 Yd3LBS7Nr   c                 <   | j                  |dg      \  }}}t        j                  d|      D cg c]  }t        |       }}d}d}	||   ||   k(  r6|dz  }|t	        t        |      t        |            k(  r	 |	 S ||   ||   k(  r6||   ||   kD  rd}	|	 S c c}w )Nz-vz[\._]r   Tr   F)run_commandresplitintminlen)
r   
pkgng_pathcompare_versionr   r   r   xversioni	new_pkgngs
             r   pkgng_older_thanr'      s    %%z4&89LBS!xx#67!s1v7G7	AI
!


*	QC(#g,77 = !


*
 1
*I= 8s   Bc                    d}dg}|j                  | j                  rdnd        ||d| j                   i\  }}}t        j                  d|t        j                        }|D ]  }|t        |      z  } |dkD  r	dd|z  ||fS d	d
||fS )Nr   r   r   -ycheck_rcz<^Number of packages to be (?:upgraded|reinstalled): ([0-9]+)Tzupdated %s package(s)Fzno packages need upgrades)append
check_moder   findall	MULTILINEr   )	r   r   
upgraded_c
pkgng_argsr   r   r   matchesmatchs	            r   upgrade_packagesr3      s    JJf//dT:jK8I8I4IKLBSjjWY\^`^j^jkG !c%j 
! A~-
:CEE.S99r   c                    d}d}d}|D ]l  }t        | ||      s| j                  s |dd|      \  }}}	||z  }||	z  }| j                  s't        | ||      r| j                  d|d||       |dz  }n |dkD  r	d	d
|z  ||fS dd||fS )Nr    deleter)   zfailed to remove : msgstdoutstderrr   Tzremoved %s package(s)Fzpackage(s) already absent)r   r,   	fail_json)
r   r   packagesremove_cr:   r;   packager   r   r   s
             r   remove_packagesr@      s    HFF VY8  $XtW=LBScMFcMF  ]69g%Ngs!KTZcijA !|-8&&II.??r   c           	         t        t              }t        t              }d}d}| j                  s7|s5 |d      \  }	}
}||
z  }||z  }|	dk7  r| j	                  d|	|
|fz  ||       |D ]W  }t        | ||      }|r|dk(  r|r|dk(  rt        | ||      s-|r|d   j                  |       D|d	   j                  |       Y |j                         D ]  \  }}| j                  r||xx   t        |      z  cc<   )|d
dg|z   } || \  }	}
}||
z  }||z  }|D ]T  }d}|d	k(  rt        | ||      }n|dk(  rt        | ||       }|r||xx   dz  cc<   ;| j	                  d|d|||       V  t        |j                               dkD  rdddd}g }|j                         D ]5  \  }}|j                  |j                  ||      d|d|dk7  rdnd       7 ddj                  |      ||fS dd|z  ||fS )Nr5   updater   z&Could not update catalogue [%d]: %s %sr8   presentlatestr   installz-Ur)   Fr   z
failed to  	installedupgraded)rE   r   z packagesTz; zpackage(s) already %s)r   listr   r,   r<   r   r   r+   itemsr    sumvaluesgetjoin)r   r   r=   cachedstateaction_queueaction_countr:   r;   r   r   r   r?   already_installedactionpackage_listr0   verified
past_tensemessagescounts                        r   install_packagesr[      sx   t$Ls#LFFV *C##7!IRQTVYN!Zcirxy 4)&)WE)!3 %8"3 G<#**73#**734" #/"4"4"6 j  C$55 dD)L8
 *-C## $ 
	jGH"(GD9$+FIwGGV$)$  &'%JSYbh i
	jj4 < !A%!,D
+113 	tOVUOO1OQV_dhi_iX[oqXqrs	t dii)66::*e4ffEEr   c                      |dd|      \  }}}t        j                  d|z  |t         j                        }|r|j                  d      S y)Nr	   -Az$^\s*(?P<tag>%s)\s*:\s*(?P<value>\w+)flagsvalueF)r   searchr.   group)r   r   r?   tagr   r   r   r2   s           r   annotation_queryrd   *  sJ    VT73LBSII=CSPRP\P\]E{{7##r   c           
          t        | |||      }|s>| j                  s1 |ddd|||d      \  }}}|dk7  r| j                  d|d||	       y||k7  r| j                  d
|d|d|d|       yy)Nannotater)   r]   Tdatabinary_datar   zcould not annotate r7   r9   r;   failed to annotate z
, because z is already set to z, but should be set to r9   Frd   r,   r<   	r   r   r?   rc   r`   _valuer   r   r   s	            r   annotation_addrp   2  s    fi#>F  $ZtWcPUcghLBSQw  $+S&2:= ! ?	5VU, 	 	-  r   c                     t        | |||      }|r;| j                  s. |ddd||      \  }}}|dk7  r| j                  d|d||       yy	)
Nrf   r)   z-Dr   zcould not delete annotation to r7   rj   TFrm   rn   s	            r   annotation_deleterr   G  sc    fi#>F  $ZtWcJLBSQw  $+S&2:= ! ?r   c           
      B   t        | |||      }|s| j                  d|d|d       y ||k(  ry| j                  sc |ddd|||d	
      \  }}}|dk7  rKt        j                  d|d||t        j
                        | j                  d|d|d|d||       y	)Nzcould not change annotation to z: tag z does not existrl   Frf   r)   z-MTrg   r   ^z$-[^:]+: Modified annotation tagged: r^   rk   z, could not change annotation z to r7   rj   )rd   r<   r,   r   ra   r.   rn   s	            r   annotation_modifyru   S  s    fi#>F#S* 	+	5  $ZtWcPUcghLBS
 aIIgWZ[]`hjhthtu}  $+S%&>FI ! Kr   c           
      j   d}t        |      dk(  rt        j                  d|d         }t        t        t
        d}|D ]g  }|D ]`  }t        j                  d|      }|| j                  d|d|       |j                         } ||d	      | |||d
   |d         s\|dz  }b i |dkD  rdd|z  fS y)Nr   r   z\s*,\s*)+-:z3(?P<operation>[-+:])(?P<tag>[^=]+)(=(?P<value>.+))?rk   z, invalid annotate string: rl   	operationrc   r`   Tzadded %s annotations.)Fzchanged no annotations)	r    r   r   rp   rr   ru   r2   r<   	groupdict)	r   r   r=   annotations
annotate_crz   r?   annotation_string
annotations	            r   annotate_packagesr   k  s    J
;1 hhz;q>: I   !, 	 
 OQbc  !   13 ! 
 $--/J1yK01&)WjY^N_aklsatua
	  $ A~-
:;;,r   c                    d}d} |dd      \  }}}d}t        j                  d|t         j                        }|rt        |j	                  d            }|dk(  rdd||fS | j
                  s |dd	      \  }}}||z  }||z  }d
d|z  ||fS )Nr5   
autoremover   r   zF^Deinstallation has been requested for the following ([0-9]+) packagesr   Fzno package(s) to autoremover)   Tzautoremoved %d package(s))r   ra   r.   r   rb   r,   )	r   r   r:   r;   r   r   r   autoremove_cr2   s	            r   autoremove_packagesr     s    FF\40LBSLII^`cegeqeqrE5;;q>*q4ffEE t4C##->OOr   c                     t        t        t        dg dd      t        dgddd	      t        dd
      t        ddd
      t        ddd      t        d      t        dd      t        dd      t        dd      t        dd
      t        ddd
            dg dg      j                  dd      j                  d   } d}g }d}d}d d   ,t	        g d      }|rj                  d       ndd   z  d   r#t	        g d      }|rj                  d       d   dd   z  d    d!d    z  t	        g d"      fd#}| d$gk(  r:d%   d&k(  r2t        |      \  }}	}
}|xs |}||
z  }||z  }|j                  |	       t        |       d'k(  rt        j                  d(| d)         } | D cg c]
  }|d$k7  s	| }}d%   d*v r>|r<t        ||d+   d%         \  }}	}}||z  }||z  }|xs |}|j                  |	       n=d%   d,k(  r5|r3t        ||      \  }}	}}||z  }||z  }|xs |}|j                  |	       d-   r2t        |      \  }}	}
}|xs |}||
z  }||z  }|j                  |	       d.   +t        || d.         \  }}	|xs |}|j                  |	       j                  |d/j!                  |      ||0       y c c}w )1NrC   )rC   rD   absentF)defaultchoicesrequiredpkgTrJ   str)aliasesr   typeelementsbool)r   r   )r   r   r   )r   r   r   )r   path)r   r   )rQ   r   rP   ignore_osverr   pkgsiterootdirchrootjailr   	use_globs)r   r   r   )argument_specsupports_check_modemutually_exclusiver   r5   r   )r      r   z:To use option 'rootdir' pkg version must be 1.5 or greaterrl   z--rootdir=%sr   )r      r   z@To use option 'ignore_osver' pkg version must be 1.11 or greaterr   z--chroot=%sr   z	--jail=%s)r   r      c                 0   | g}d   r	| dv rd|z   }ddi}d   rd|d<   d   &| d	v r"	r	d   |d
<   n|j                  dd          |j                  |j                  dt                             j                  |t        |      z   fd|i|S )Nr   )r	   rE   r   )z-gBATCHyesr   IGNORE_OSVERSIONr   )rB   rE   r   PACKAGESITEz--repository=environ_update)r+   rB   popdictr   rJ   )
rU   argskwargscmd	pkgng_envdir_argr   pr!   repo_flag_not_supporteds
        r   r   zmain.<locals>.run_pkgng  s    7F+[>f(GGT>De$	^,1I()Y<#2S(S&+,Y<	-(

)>? 	$4df=>!v!!#T
"2W9WPVWWr   *rQ   rD   r   z[,\s]r   )rC   rD   rP   r   r   r   z, )changedr9   r:   r;   )r   r   get_bin_pathparamsr'   r<   r3   r+   r    r   r   r[   r@   r   r   	exit_jsonrO   )pkgsr   msgsr:   r;   rootdir_not_supportedignore_osver_not_supportedr   _changed_msg_stdout_stderrr   named_packages_out_errr   r   r   r!   r   s                   @@@@@r   mainr     so   y2Q\abug6ERF3ee&IU%H%(%f5V4u51E74%fE
 !9:<F" $$UD1JAV9DGDFFG| 0Y O !]^$)5G%5fj*%U"%!cd{1X;/y6+ /vz9MX X. u}7x/+;FI+N($%X''D 4yA~
 xx$q'*%)8cSCZc8N8z**~%5fi67k1W:&O"$d$$%XD	
7x	N%4VY%W"$d$$%XD+>vy+Q($%X''D"*69dAlOT$%XD
W$))D/&QWX9 9s   
K.K.__main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLEScollectionsr   r   ansible.module_utils.basicr   r   r   r'   r3   r@   r[   rd   rp   rr   ru   r   r   r   __name__r
   r   r   <module>r      s    A @\|#L $ 	 4":"@4@FF*	0"-JP,vYr zF r   