
    Vhm$                        d dl mZ d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	 Z G d
 de      Zd Zedk(  r e        yy)    )annotationsa/  
---
module: rpm_key
author:
  - Hector Acosta (@hacosta) <hector.acosta@gazzang.com>
short_description: Adds or removes a gpg key from the rpm db
description:
  - Adds or removes C(rpm --import) a gpg key to your rpm database.
version_added: "1.3"
options:
    key:
      description:
        - Key that will be modified. Can be a url, a file on the managed node, or a keyid if the key
          already exists in the database.
      type: str
      required: true
    state:
      description:
        - If the key will be imported or removed from the rpm db.
      type: str
      default: present
      choices: [ absent, present ]
    validate_certs:
      description:
        - If V(false) and the O(key) is a url starting with V(https), SSL certificates will not be validated.
        - This should only be used on personally controlled sites using self-signed certificates.
      type: bool
      default: 'yes'
    fingerprint:
      description:
        - The long-form fingerprint of the key being imported.
        - This will be used to verify the specified key.
      type: list
      elements: str
      version_added: 2.9
extends_documentation_fragment:
    - action_common_attributes
attributes:
    check_mode:
        support: full
    diff_mode:
        support: none
    platform:
        platforms: rhel
a!  
- name: Import a key from a url
  ansible.builtin.rpm_key:
    state: present
    key: http://apt.sw.be/RPM-GPG-KEY.dag.txt

- name: Import a key from a file
  ansible.builtin.rpm_key:
    state: present
    key: /path/to/key.gpg

- name: Ensure a key is not present in the db
  ansible.builtin.rpm_key:
    state: absent
    key: DEADB33F

- name: Verify the key, using a fingerprint, before import
  ansible.builtin.rpm_key:
    key: /path/to/RPM-GPG-KEY.dag.txt
    fingerprint: EBC6 E12C 62B1 C734 026B  2122 A20E 5214 6B8D 79E6

- name: Verify the key, using multiple fingerprints, before import
  ansible.builtin.rpm_key:
    key: /path/to/RPM-GPG-KEY.dag.txt
    fingerprint:
      - EBC6 E12C 62B1 C734 026B  2122 A20E 5214 6B8D 79E6
      - 19B7 913E 6284 8E3F 4D78 D6B4 ECD9 1AB2 2EB6 8D86
#N)AnsibleModule)	fetch_url)	to_nativec           	     x    d}t        t        j                  |t        | d      t        j                              S )zVerifies if string is a pubkeyzP.*?(-----BEGIN PGP PUBLIC KEY BLOCK-----.*?-----END PGP PUBLIC KEY BLOCK-----).*surrogate_or_strict)errors)boolrematchr   DOTALL)string	pgp_regexs     G/home/dcms/DCMS/lib/python3.12/site-packages/ansible/modules/rpm_key.py	is_pubkeyr   b   s.    bIIf=R$SUWU^U^_``    c                  H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)RpmKeyc                    d }d}|| _         | j                   j                  dd      | _        |j                  d   }|j                  d   }|j                  d   }t	               }|r%t        |t              s|g}t	        d |D              }| j                   j                  d      | _        | j                  s"| j                   j                  d	d
      | _        d|v r%| j                  |      }| j                  |      }d}nf| j                  |      r|}nRt        j                  j                  |      r|}| j                  |      }n| j                   j                  d|z         | j                        }|dk(  r| j!                  |      r|j#                  d       y |s| j                   j                  d       |rE| j%                  |      }	|j'                  |	      s#| j                   j                  d|d|	d       | j)                  |       |r| j                   j+                  |       |j#                  d       y | j!                  |      r$| j-                  |       |j#                  d       y |j#                  d       y )NFrpmTstatekeyfingerprintc              3  \   K   | ]$  }|j                  d d      j                          & yw)  N)replaceupper).0fs     r   	<genexpr>z"RpmKey.__init__.<locals>.<genexpr>y   s$     Oaqyyb1779Os   *,gpggpg2)requiredz://zNot a valid key %smsgpresent)changedz0When importing a key, a valid file must be givenzThe specified fingerprint, 'z+', does not match any key fingerprints in '')moduleget_bin_pathr   paramsset
isinstancelistr#   	fetch_keygetkeyidis_keyidospathisfile	fail_jsonnormalize_keyidis_key_imported	exit_jsongetfingerprintsissubset
import_keycleanupdrop_key)
selfr+   keyfileshould_cleanup_keyfiler   r   r   fingerprintskeyidkeyfile_fingerprintss
             r   __init__zRpmKey.__init__j   s9    !&;;++E48g&mmE"mmM2uk40*mO;OOL;;++E2xx{{///FDHC<nnS)GMM'*E%)"]]3EWW^^C GMM'*EKK!!&:S&@!A$$U+I##E*   /KK)).`)a+/+?+?+H('001EF--S_au!w .  ()KK''0   .##E*e$   .   /r   c                   t        | j                  |      \  }}|d   dk7  r%| j                  j                  d|d|d          |j                         }t	        |      s| j                  j                  d|z         t        j                         \  }}| j                  j                  |       t        j                  |d      }|j                  |       |j                          |S )	z;Downloads a key from url, returns a valid path to a gpg keystatus   zfailed to fetch key at z , error was: r'   r&   zNot a public key: %szw+b)r   r+   r7   readr   tempfilemkstempadd_cleanup_filer4   fdopenwriteclose)r@   urlrspinfor   tmpfdtmpnametmpfiles           r   r1   zRpmKey.fetch_key   s    dkk3/	T>S KK!!UXZ^_dZe&f!ghhj~KK!!&<s&B!C!))+w$$W-))E5)cr   c                    |j                         j                         }|j                  d      r|dd S |j                  d      r|dd S |S )zhEnsure a keyid doesn't have a leading 0x, has leading or trailing whitespace, and make sure is uppercase0x   N0X)stripr   
startswith)r@   rD   rets      r   r8   zRpmKey.normalize_keyid   sI    kkm!!#>>$qr7N^^D!qr7NJr   c                   | j                  | j                  dddd|g      \  }}|j                         D ]9  }|j                         }|j	                  d      s%|j                  d      d   c S  | j                  j                  d	       y )
N--no-tty--batch--with-colons--fixed-list-modezpub::   Unexpected gpg outputr&   )execute_commandr#   
splitlinesr[   r\   splitr+   r7   )r@   rA   stdoutstderrlines        r   r2   zRpmKey.getkeyid   s    --txxYP_atv}.~%%' 	*D::<Dv&zz#q))	*
 	"9:r   c                \   | j                  | j                  dddddddd|g
      \  }}t               }|j                         D ]G  }|j	                         }|j                  d	      s%|j                  |j                  d
      d          I |r|S | j                  j                  d       y )Nr_   r`   ra   rb   --importz--import-optionsz	show-onlyz	--dry-runzfpr:rc   	   re   r&   )
rf   r#   r.   rg   r[   r\   addrh   r+   r7   )r@   rA   ri   rj   rC   rk   s         r   r;   zRpmKey.getfingerprints   s    --HHj)_-?/
  u%%' 	5D::<Dv&   C!34	5 "9:r   c                N    t        j                  d|t         j                        S )z5Verifies if a key, as provided by the user is a keyidz(0x)?[0-9a-f]{8})flags)r   r   
IGNORECASE)r@   keystrs     r   r3   zRpmKey.is_keyid   s    xx*F"--HHr   c                    | j                   j                  |d      \  }}}|dk7  r| j                   j                  |       ||fS )NT)use_unsafe_shellr   r&   )r+   run_commandr7   )r@   cmdrcri   rj   s        r   rf   zRpmKey.execute_command   sH    ![[44S44PFF7KK!!f!-v~r   c                   | j                   dz   }| j                  j                  |      \  }}}|dk7  ry|d| j                  z   dz   z  }| j	                  |      \  }}|j                         D ]  }||j                  d      d   v s y y)	Nz -q  gpg-pubkeyr   Fz --qf "%{description}" | z3 --no-tty --batch --with-colons --fixed-list-mode -rc   rd   T)r   r+   rv   r#   rf   rg   rh   )r@   rD   rw   rx   ri   rj   rk   s          r   r9   zRpmKey.is_key_imported   s    hh**![[44S9FF7*TXX58mmm--c2%%' 	D

3**	 r   c                n    | j                   j                  s| j                  | j                  d|g       y y )Nrm   )r+   
check_moderf   r   )r@   rA   s     r   r=   zRpmKey.import_key   s-    {{%%  $((J!@A &r   c           	         | j                   j                  s4| j                  | j                  ddd|dd  j	                         z  g       y y )Nz--erasez--allmatcheszgpg-pubkey-%si)r+   r{   rf   r   lower)r@   rD   s     r   r?   zRpmKey.drop_key   sG    {{%%  $((I~Y^_a_bYcYiYiYkGk!lm &r   N)__name__
__module____qualname__rF   r1   r8   r2   r;   r3   rf   r9   r=   r?    r   r   r   r   h   s8    80t ;;6I
Bnr   r   c                     t        t        t        ddddg      t        ddd      t        dd	      t        d
d            d      } t        |        y )Nstrr(   absent)typedefaultchoicesTF)r   r%   no_logr0   )r   elementsr   )r   r   )r   r   r   validate_certs)argument_specsupports_check_mode)r   dictr   )r+   s    r   mainr     sS    E9x>ST%$u=&59VT:	
 !F 6Nr   __main__)
__future__r   DOCUMENTATIONEXAMPLESRETURNr   os.pathr4   rK   ansible.module_utils.basicr   ansible.module_utils.urlsr   +ansible.module_utils.common.text.convertersr   r   objectr   r   r~   r   r   r   <module>r      sd    #,\: 
 	   5 / AaVnV Vnr zF r   