
    Vhql                         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Zd dlZd dlm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edk(  r e        yy)    )absolute_importdivisionprint_functionat  
module: openbsd_pkg
author:
  - Patrik Lundin (@eest)
short_description: Manage packages on OpenBSD
description:
  - Manage packages on OpenBSD using the pkg tools.
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: partial
    version_added: 9.1.0
    details:
      - Only works when check mode is not enabled.
options:
  name:
    description:
      - A name or a list of names of the packages.
    required: true
    type: list
    elements: str
  state:
    description:
      - V(present) will make sure the package is installed.
      - V(latest) will make sure the latest version of the package is installed.
      - V(absent) will make sure the specified package is not installed.
    choices: [absent, latest, present, installed, removed]
    default: present
    type: str
  build:
    description:
      - Build the package from source instead of downloading and installing a binary. Requires that the port source tree is
        already installed. Automatically builds and installs the C(sqlports) package, if it is not already installed.
      - Mutually exclusive with O(snapshot).
    type: bool
    default: false
  snapshot:
    description:
      - Force C(%c) and C(%m) to expand to C(snapshots), even on a release kernel.
      - Mutually exclusive with O(build).
    type: bool
    default: false
    version_added: 1.3.0
  ports_dir:
    description:
      - When used in combination with the O(build) option, allows overriding the default ports source directory.
    default: /usr/ports
    type: path
  clean:
    description:
      - When updating or removing packages, delete the extra configuration file(s) in the old packages which are annotated
        with C(@extra) in the packaging-list.
    type: bool
    default: false
  quick:
    description:
      - Replace or delete packages quickly; do not bother with checksums before removing normal files.
    type: bool
    default: false
notes:
  - 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: Make sure nmap is installed
  community.general.openbsd_pkg:
    name: nmap
    state: present

- name: Make sure nmap is the latest version
  community.general.openbsd_pkg:
    name: nmap
    state: latest

- name: Make sure nmap is not installed
  community.general.openbsd_pkg:
    name: nmap
    state: absent

- name: Make sure nmap is installed, build it from source if it is not
  community.general.openbsd_pkg:
    name: nmap
    state: present
    build: true

- name: Specify a pkg flavour with '--'
  community.general.openbsd_pkg:
    name: vim--no_x11
    state: present

- name: Specify the default flavour to avoid ambiguity errors
  community.general.openbsd_pkg:
    name: vim--
    state: present

- name: Specify a package branch (requires at least OpenBSD 6.0)
  community.general.openbsd_pkg:
    name: python%3.5
    state: present

- name: Update all packages on the system
  community.general.openbsd_pkg:
    name: '*'
    state: latest

- name: Purge a package and its configuration files
  community.general.openbsd_pkg:
    name: mpd
    clean: true
    state: absent

- name: Quickly remove a package without checking checksums
  community.general.openbsd_pkg:
    name: qt5
    quick: true
    state: absent
N)AnsibleModule)LooseVersionc                 V    t        j                  |       }|j                  |ddi      S )NTERMdumb)environ_update)shlexsplitrun_command)cmdmodulecmd_argss      q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/openbsd_pkg.pyexecute_commandr      s/     {{3H
 h7GHH    c                 X    d}t        ||       \  }}}|r| j                  d|z         |S )z?
    Get all installed packaged. Used to support diff mode
    pkg_info -Iqz!failed in get_all_installed(): %smsg)r   	fail_json)r   commandrcstdoutstderrs        r   get_all_installedr      s;     G(&9B@6IJMr   c                 f   d}| D ]  }|d|}t        ||      \  }}}|rLt        j                  dt        j                  |      z  |      }	|	r	d||   d<   n|j	                  d|z          |r9|j                         ||   d<   |j                  d	||   d   z         d
||   d<   d||   d<    y )Nr   z inst:z^Can't find inst:%s$Finstalled_statezfailed in get_package_state(): r   installed_namesz)get_package_state(): installed_names = %sT)r   researchescaper   
splitlinesdebug)
namespkg_specr   info_cmdnamer   r   r   r   matchs
             r   get_package_stater,      s    H 6"*D1,Wf=FFII5		$GPE4901  %F%O P 170A0A0CHTN,-LLDxPT~VgGhhi04HTN,-05HTN,-'6r   c                 .   |j                   d   }| D ]  }|d   r0||d   vr|j                  d|z         %|j                  d|z         |j                  rd}n|du r|j                   d   dt        |||      }t        j
                  j                  |      rH||   d	   r"||   d	   j                  d
d      }d|d|d}n6||   d   rd|d||   d   d}nd|z  }n|j                  d|z         nd}|j                   d   du rdz  }||   d   du rV|du r7|j                  s+|j                  |d      \  ||   d<   ||   d<   ||   d<   n't        d||      \  ||   d<   ||   d<   ||   d<   ||   d   s|du r%|j                  d|z         ||   d   rd||   d<   n|j                  d |z         ||   d   r|t        j                  d!t        j                  ||   d"         z  ||   d         }|r|j                  d#|z         d||   d<   n9|j                  d$|z         d%||   d<   d||   d<   n|j                  d&|z         ||   d   d'k(  sWd||   d<   ad'||   d<   d(||   d<   d(||   d<   d||   d<    y ))Nbuildpackage_latest_leftoverszIpackage_present(): ignoring '%s' which is not a package_latest() leftoverzGpackage_present(): handling package_latest() leftovers, installing '%s'zpkg_add -ImnT	ports_dir/flavor- zcd z" && make clean=depends && FLAVOR="z$" make install && make clean=depends
subpackagez& && make clean=depends && SUBPACKAGE="z+cd %s && make install && make clean=dependsz+the port source directory %s does not existr   zpkg_add -Imsnapshot -Dsnapr    F)use_unsafe_shellr   r   r   versionz9package_present(): depending on return code for name '%s'changedz4package_present(): depending on stderr for name '%s'z\W%s-[^:]+: ok\Wstemz@package_present(): we were able to install package for name '%s'z3package_present(): we really did fail for name '%s'   z3package_present(): stderr was not set for name '%s'r    )paramsr&   
check_modeget_package_source_pathospathisdirreplacer   r   r   r"   r#   r$   )	r'   r(   r   r.   r*   install_cmdport_dirflavorsr+   s	            r   package_presentrH      s|   MM'"E W. ./8$>??hkoopfimmn(K}&,mmK&@BYZ^`hjpBqr77==*~h/"*4.":"B"B3"L |D  FM  'N!$5 @H @H  IM  @N  O[  @\'] 'TW_&`$$)VZb)c$d+==$,9$KD>+,5 }V%6%6]c]o]op{  ~D  W[]o  ^\Z$%x~h'?$PXAY]l  yD  FJ  nK  MS  ^TZ$%x~h'?$PXAY ~i(ETMX[__`D>$'05HTN9- SVZZ[D>(+ II&9BIIhtnU[F\<]&]_ghl_mnv_wxE%gjn%no48y1 %Z]a%ab/0t,49y1LL!VY]!]^~d#q(,0y) $%HTN4 ')HTN8$')HTN8$(-HTN9%oW.r   c                 @   |j                   d   du r"|j                  d|j                   d   z         d}|j                  r|dz  }|j                   d   r|dz  }|j                   d	   r|d
z  }|j                   d   r|dz  }| D ]  }||   d   du rt        |d||      \  ||   d<   ||   d<   ||   d<   d||   d<   ||   d   D ]h  }|j	                  d|z         t        j                  dt        j                  |      z  ||   d         }|sL|j	                  d|z         d||   d<    n ||   d   dus||   d   sd||   d<   |j	                  d|z         |d   j                  |        |d   r|j	                  d       t        | ||       y y )Nr.   Tz=the combination of build=%s and state=latest is not supportedr   zpkg_add -umncleancquickqr6   r7   r    r4   r   r   r   Fr:   r!   z;package_latest(): checking for pre-upgrade package name: %sz\W%s->.+: ok\Wz4package_latest(): pre-upgrade package name match: %sr<   zUpackage_latest(): package '%s' is not installed, will be handled by package_present()r/   z?package_latest(): calling package_present() to handle leftovers)
r>   r   r?   r   r&   r"   r#   r$   appendrH   )r'   r(   r   upgrade_cmdr*   installed_namer+   s          r   package_latestrR   &  s   }}W%\_e_l_lmt_uuvKs}}Ws}}Ws}}Z y  #>D>+,4 Zit  BF  jG  IO  ZPVXd^D!8D>(#;Xd^H=U
 ).HTN9%"*4.1B"C Z]kkl		"3bii6O"OQYZ^Q_`hQijLL!WZh!hi04HTN9-$ ~i(4D>(++,HTN4( LLpswwx/077=G#>N *+VWx0 ,r   c                 d   d}|j                   r|dz  }|j                  d   r|dz  }|j                  d   r|dz  }| D ]p  }||   d   du rDt        |d	||      \  ||   d
<   ||   d<   ||   d<   ||   d
   dk(  r	d||   d<   Hd||   d<   Qd||   d
<   d||   d<   d||   d<   d||   d<   r y )Nzpkg_delete -IrJ   rK   rL   rM   rN   r    Tr4   r   r   r   r   r:   Fr=   )r?   r>   r   )r'   r(   r   
remove_cmdr*   s        r   package_absentrU   e  s    Jc
}}Wc
}}Wc
 .D>+,4Yht~  AE  jF  HN  ZOVXd^D!8D>(#;Xd^H=U~d#q(,0y),1y) $%HTN4 ')HTN8$')HTN8$(-HTN9%.r   c                 &   g |d<   | D ]  }|j                  d|z         t        j                  d|      }t        j                  d|      }|r|r|j                  d|z          i ||<   |rt        j                  d|      }|r|j	                  d      ||   d<   d	||   d
<   |j	                  d      ||   d<   |j	                  d      ||   d<   |j	                  d      ||   d<   |j	                  d      ||   d<   d||   d<   |j                  d||   z         n_|j                  d|z          nH|rt        j                  d|      }|r}|j	                  d      ||   d<   d	||   d
<   d ||   d<   d	||   d<   |j	                  d      ||   d<   |j	                  d      ||   d<   d||   d<   |j                  d||   z         n|j                  d|z          nt        j                  d|      }|rn|j	                  d      ||   d<   d ||   d
<   d ||   d<   d ||   d<   d ||   d<   |j	                  d      ||   d<   d||   d<   |j                  d||   z         n|j                  d|z          ||   d   rCd}t        t        j                               t        |      k  r|j                  d|d|       ||   d   st        j                  d||   d         }|s|j                  d||   d   z          	 y )Nr/   z&parse_package_name(): parsing name: %sz-[0-9]z--z5package name both has a version and is version-less: r   zg^(?P<stem>[^%]+)-(?P<version>[0-9][^-]*)(?P<flavor_separator>-)?(?P<flavor>[a-z].*)?(%(?P<branch>.+))?$r;   r3   version_separatorr9   flavor_separatorr2   branchstylezversion_match: stem: %(stem)s, version: %(version)s, flavor_separator: %(flavor_separator)s, flavor: %(flavor)s, branch: %(branch)s, style: %(style)sz/unable to parse package name at version_match: z9^(?P<stem>[^%]+)--(?P<flavor>[a-z].*)?(%(?P<branch>.+))?$versionlessz[versionless_match: stem: %(stem)s, flavor: %(flavor)s, branch: %(branch)s, style: %(style)sz3unable to parse package name at versionless_match: z#^(?P<stem>[^%]+)(%(?P<branch>.+))?$z@stem_match: stem: %(stem)s, branch: %(branch)s, style: %(style)sz&unable to parse package name at else: z6.0z=package name using 'branch' syntax requires at least OpenBSD z: z-$ztrailing dash in flavor: )r&   r"   r#   r   groupr   platformrelease)r'   r(   r   r*   version_matchversionless_matchr+   branch_releases           r   parse_package_namerb     s    ,.H'( J]=DE		(D1IIdD1 .!X[_!_`  II  H  JN  OE).V)<v&6923,1KK	,By)5:[[AS5T12+0;;x+@x(+0;;x+@x(*3w' XZbcgZhi j   %VY]%] ^ IIY[_`E).V)<v&6923,0y)5812+0;;x+@x(+0;;x+@x(*7w'z  ~F  GK  ~L  L  M  %Z]a%a b IICTJE).V)<v&6:23,0y)5912+/x(+0;;x+@x(*0w'_bjkobppq  %MPT%T U D>(#"NH,,./,~2NN  n|  C  &D   E D>(#IIdHTN8$<=E  %@8D>RZC[%[ \UJ]r   c                 |   d ||    d<   ||    d   dk(  ryd}t         j                  j                  |      s|j                  d|z         t	        j
                  |      }d}|d	z   }|j                  d
|z         |j                  || f      }|j                         }t        |      dk  r||    d   ||    d   xs dz   ||    d   xs dz   }	|dz   }||    d   r<|	||    d   ||    d   z   z  }	|j                  d|z         |j                  ||	f      }nc||    d   dk(  r1|dz  }|j                  d|z         |j                  ||	d|	z  f      }n'|j                  d|z         |j                  ||	f      }|j                         }|j                          t        |      dk  r|j                  d| z         t        |      dkD  r1t        d |      }
|j                  ddj                  |
      z         |d   d   }|j                  d      }t        |      dkD  r|d   d   dk(  r|d   ||    d<   |d   S ) Nr5   r;   sqlportszdatabases/sqlportsz/usr/local/share/sqlportszsqlports file '%s' is missingr   z<SELECT fullpkgpath, fullpkgname FROM ports WHERE fullpkgnamez = ?z.package_package_source_path(): exact query: %sr<   rW   r3   r9   %z LIKE ?r2   rX   z5package_package_source_path(): fuzzy flavor query: %srZ   r[   z AND fullpkgname NOT LIKE ?z:package_package_source_path(): fuzzy versionless query: %sz%s-%%z.package_package_source_path(): fuzzy query: %sz&could not find a port by the name '%s'c                     | d   S )Nr<    )xs    r   <lambda>z)get_package_source_path.<locals>.<lambda>  s
    AaD r   z+too many matches, unsure which to build: %sz OR r   ,)rA   rB   isfiler   sqlite3connectr&   executefetchalllenclosemapjoinr   )r*   r(   r   sqlports_db_fileconnfirst_part_of_queryquerycursorresultslooking_formatchesfullpkgpathpartss                r   r@   r@     s   #'HTN< ~f+# 7ww~~./!@CS!ST/0\#f,EMNedW-//# w<!"4.0HTNCV4W4^[^_cklpcqr{c|  dD  AD  EK')3E~h'x~.@AHTNS[D\\\TW\\]ek^<$(M966Y\aabek7[;P-RSMPUUVek^<oo'G 	

w<!!ID!PQw<!.'2G!NQWQ\Q\]dQe!ef ajm!!#&u:>eAhqkS0+08HTN<(Qxr   c                 2   |j                   rd}nd}|j                  d   r|dz  }i | d<   t        d|z  |      \  | d   d<   | d   d<   | d   d	<   t        j                  d
| d   d         }|r	d| d   d<   nd| d   d<   | d   d	   r	d| d   d<   y d| d   d<   y )Nzpkg_add -Imnuzpkg_add -Imur6   r7   *z%sr   r   r   z\W\w.+->.+: ok\WTr:   Fr<   r   )r?   r>   r   r"   r#   )r(   r   rP   r+   s       r   upgrade_packagesr     s    %$}}Z y  HSM M\\`cn\npvLwIHSM$#x0(3-2I II)8C=+BCE#'i  $)i  }Xddr   c                      t        t        t        ddd      t        ddg d      t        dd	
      t        dd	
      t        dd
      t        dd	
      t        dd	
            ddggd      } | j                  d   }| j                  d   }| j                  d   }| j                  d   }d}d}d}i }||d<   ||d<   ||d<   i |d<   i }	t        |       x}
}|du rt        j
                  j                  |      s| j                  d|z         t        dg|	|        t        dg|	|        |	d   d   s/| j                  d| j                  d   z         t        dg|	|        d	}|D ]*  }|dk(  s	t        |      dk7  r| j                  d       d}, |r%|dk7  r| j                  d        nt        |	|        nt        ||	|        |D ]B  }|	|   d!   s| j                  d   du s| j                  d"| j                  d   d#|       D t        ||	|        |d$v rt        ||	|        n$|d%v rt        ||	|        n|dk(  rt        ||	|        d	}d	}d}|D ]W  }|	|   d&   dk7  r=d}|	|   d'   r|r|d(|	|   d'   z  z  }n"|	|   d'   }n|r|d(|	|   d)   z  z  }n|	|   d)   }|	|   d*   du sVd}Y |r | j                  d-d+|i| ||d*<   |d*   r'| j                   st        |       }
t        ||
,      |d<    | j"                  d-i | y ).NliststrT)typeelementsrequiredpresent)absent	installedlatestr   removed)r   defaultchoicesboolF)r   r   rB   z
/usr/ports)r*   stater.   r6   r0   rM   rK   r6   r.   )argument_specmutually_exclusivesupports_check_moder*   r   r0   r   r=   diffz,the ports source directory %s does not existr   rd   r    z.main(): installing 'sqlports' because build=%sr   r<   z6the package name '*' can not be mixed with other namesr   z:the package name '*' is only valid when using state=latestrY   z-the combination of 'branch' syntax and build=z is not supported: )r   r   )r   r   r   r   z, %sr   r:   r   )beforeafterrg   )r   dictr>   r   rA   rB   rC   r   rb   r,   r&   rH   rp   r   rU   rR   r?   	exit_json)r   r*   r   r.   r0   r   r   r   resultr(   new_package_listoriginal_package_listasterisk_namerJ   combined_changedcombined_failedcombined_error_messages                    r   mainr   0  s   6EDAE9>uvFE2vu5=FE2FE2
 (12 F == DMM'"EMM'"Ek*I	
BFFFF6NF7OF7OF6N H/@/HH,}ww}}Y'!OS\!]^ 	J<6::,&9
#$56LLIFMMZaLbbcZL(F;M !84yA~  %] ^ M! H!]^ Xv. 	462  	KA{8$w)?4)G  ouo|o|  ~E  pF  HI  &J   K	K
 	$&1 ,,D(F3++462h462  O    $A;t!"O{8$)*fx{87L.LL*-5a[-B*)*fx{87L.LL*-5a[-B*A;y!T)#$& >3>v>(F9i!2!2,V4%:BRSvFvr   __main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESrA   r]   r"   r   rl   ansible.module_utils.basicr   Bansible_collections.community.general.plugins.module_utils.versionr   r   r   r,   rH   rR   rU   rb   r@   r   r   __name__rg   r   r   <module>r      s    A @AF5n 
  	   4 [	I64Z.|;1~.FO]f/f Dzz zF r   