
    Vhq                         d dl mZmZmZ eZd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mZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dlmZ d dlmZ  G d de       Z! G d de"      Z#d Z$e%dk(  r e$        yy)    )absolute_importdivisionprint_functiona  
module: jenkins_plugin
author: Jiri Tyr (@jtyr)
short_description: Add or remove Jenkins plugin
description:
  - Ansible module which helps to manage Jenkins plugins.
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none

options:
  group:
    type: str
    description:
      - GID or name of the Jenkins group on the OS.
    default: jenkins
  jenkins_home:
    type: path
    description:
      - Home directory of the Jenkins user.
    default: /var/lib/jenkins
  mode:
    type: raw
    description:
      - File mode applied on versioned plugins.
    default: '0644'
  name:
    type: str
    description:
      - Plugin name.
    required: true
  owner:
    type: str
    description:
      - UID or name of the Jenkins user on the OS.
    default: jenkins
  state:
    type: str
    description:
      - Desired plugin state.
      - If set to V(latest), the check for new version will be performed every time. This is suitable to keep the plugin up-to-date.
    choices: [absent, present, pinned, unpinned, enabled, disabled, latest]
    default: present
  timeout:
    type: int
    description:
      - Server connection timeout in secs.
    default: 30
  updates_expiration:
    type: int
    description:
      - Number of seconds after which a new copy of the C(update-center.json) file is downloaded. This is used to avoid the
        need to download the plugin to calculate its checksum when O(state=latest) is specified.
      - Set it to V(0) if no cache file should be used. In that case, the plugin file will always be downloaded to calculate
        its checksum when O(state=latest) is specified.
    default: 86400
  updates_url:
    type: list
    elements: str
    description:
      - A list of base URL(s) to retrieve C(update-center.json), and direct plugin files from.
      - This can be a list since community.general 3.3.0.
    default: ['https://updates.jenkins.io', 'http://mirrors.jenkins.io']
  update_json_url_segment:
    type: list
    elements: str
    description:
      - A list of URL segment(s) to retrieve the update center JSON file from.
    default: ['update-center.json', 'updates/update-center.json']
    version_added: 3.3.0
  latest_plugins_url_segments:
    type: list
    elements: str
    description:
      - Path inside the O(updates_url) to get latest plugins from.
    default: ['latest']
    version_added: 3.3.0
  versioned_plugins_url_segments:
    type: list
    elements: str
    description:
      - Path inside the O(updates_url) to get specific version of plugins from.
    default: ['download/plugins', 'plugins']
    version_added: 3.3.0
  url:
    type: str
    description:
      - URL of the Jenkins server.
    default: http://localhost:8080
  version:
    type: str
    description:
      - Plugin version number.
      - If this option is specified, all plugin dependencies must be installed manually.
      - It might take longer to verify that the correct version is installed. This is especially true if a specific version
        number is specified.
      - Quote the version to prevent the value to be interpreted as float. For example if V(1.20) would be unquoted, it would
        become V(1.2).
  with_dependencies:
    description:
      - Defines whether to install plugin dependencies.
      - This option takes effect only if the O(version) is not defined.
    type: bool
    default: true

notes:
  - Plugin installation should be run under root or the same user which owns the plugin files on the disk. Only if the plugin
    is not installed yet and no version is specified, the API installation is performed which requires only the Web UI credentials.
  - It is necessary to notify the handler or call the M(ansible.builtin.service) module to restart the Jenkins service after
    a new plugin was installed.
  - Pinning works only if the plugin is installed and Jenkins service was successfully restarted after the plugin installation.
  - It is not possible to run the module remotely by changing the O(url) parameter to point to the Jenkins server. The module
    must be used on the host where Jenkins runs as it needs direct access to the plugin files.
extends_documentation_fragment:
  - ansible.builtin.url
  - ansible.builtin.files
  - community.general.attributes
a$  
- name: Install plugin
  community.general.jenkins_plugin:
    name: build-pipeline-plugin

- name: Install plugin without its dependencies
  community.general.jenkins_plugin:
    name: build-pipeline-plugin
    with_dependencies: false

- name: Make sure the plugin is always up-to-date
  community.general.jenkins_plugin:
    name: token-macro
    state: latest

- name: Install specific version of the plugin
  community.general.jenkins_plugin:
    name: token-macro
    version: "1.15"

- name: Pin the plugin
  community.general.jenkins_plugin:
    name: token-macro
    state: pinned

- name: Unpin the plugin
  community.general.jenkins_plugin:
    name: token-macro
    state: unpinned

- name: Enable the plugin
  community.general.jenkins_plugin:
    name: token-macro
    state: enabled

- name: Disable the plugin
  community.general.jenkins_plugin:
    name: token-macro
    state: disabled

- name: Uninstall plugin
  community.general.jenkins_plugin:
    name: build-pipeline-plugin
    state: absent

#
# Example of how to authenticate
#
- name: Install plugin
  community.general.jenkins_plugin:
    name: build-pipeline-plugin
    url_username: admin
    url_password: p4ssw0rd
    url: http://localhost:8888

#
# Example of how to authenticate with serverless deployment
#
- name: Update plugins on ECS Fargate Jenkins instance
  community.general.jenkins_plugin:
    # plugin name and version
    name: ws-cleanup
    version: '0.45'
    # Jenkins home path mounted on ec2-helper VM (example)
    jenkins_home: "/mnt/{{ jenkins_instance }}"
    # matching the UID/GID to one in official Jenkins image
    owner: 1000
    group: 1000
    # Jenkins instance URL and admin credentials
    url: "https://{{ jenkins_instance }}.com/"
    url_username: admin
    url_password: p4ssw0rd
  # make module work from EC2 which has local access
  # to EFS mount as well as Jenkins URL
  delegate_to: ec2-helper
  vars:
    jenkins_instance: foobar

#
# Example of a Play which handles Jenkins restarts during the state changes
#
- name: Jenkins Master play
  hosts: jenkins-master
  vars:
    my_jenkins_plugins:
      token-macro:
        enabled: true
      build-pipeline-plugin:
        version: "1.4.9"
        pinned: false
        enabled: true
  tasks:
    - name: Install plugins without a specific version
      community.general.jenkins_plugin:
        name: "{{ item.key }}"
      register: my_jenkins_plugin_unversioned
      when: >
        'version' not in item.value
      with_dict: "{{ my_jenkins_plugins }}"

    - name: Install plugins with a specific version
      community.general.jenkins_plugin:
        name: "{{ item.key }}"
        version: "{{ item.value['version'] }}"
      register: my_jenkins_plugin_versioned
      when: >
        'version' in item.value
      with_dict: "{{ my_jenkins_plugins }}"

    - name: Initiate the fact
      ansible.builtin.set_fact:
        jenkins_restart_required: false

    - name: Check if restart is required by any of the versioned plugins
      ansible.builtin.set_fact:
        jenkins_restart_required: true
      when: item.changed
      with_items: "{{ my_jenkins_plugin_versioned.results }}"

    - name: Check if restart is required by any of the unversioned plugins
      ansible.builtin.set_fact:
        jenkins_restart_required: true
      when: item.changed
      with_items: "{{ my_jenkins_plugin_unversioned.results }}"

    - name: Restart Jenkins if required
      ansible.builtin.service:
        name: jenkins
        state: restarted
      when: jenkins_restart_required

    - name: Wait for Jenkins to start up
      ansible.builtin.uri:
        url: http://localhost:8080
        status_code: 200
        timeout: 5
      register: jenkins_service_status
      # Keep trying for 5 mins in 5 sec intervals
      retries: 60
      delay: 5
      until: >
        'status' in jenkins_service_status and
        jenkins_service_status['status'] == 200
      when: jenkins_restart_required

    - name: Reset the fact
      ansible.builtin.set_fact:
        jenkins_restart_required: false
      when: jenkins_restart_required

    - name: Plugin pinning
      community.general.jenkins_plugin:
        name: "{{ item.key }}"
        state: "{{ 'pinned' if item.value['pinned'] else 'unpinned'}}"
      when: >
        'pinned' in item.value
      with_dict: "{{ my_jenkins_plugins }}"

    - name: Plugin enabling
      community.general.jenkins_plugin:
        name: "{{ item.key }}"
        state: "{{ 'enabled' if item.value['enabled'] else 'disabled'}}"
      when: >
        'enabled' in item.value
      with_dict: "{{ my_jenkins_plugins }}"
z
plugin:
  description: Plugin name.
  returned: success
  type: str
  sample: build-pipeline-plugin
state:
  description: State of the target, after execution.
  returned: success
  type: str
  sample: "present"
N)AnsibleModuleto_bytes)http_cookiejar)	urlencode)	fetch_urlurl_argument_spec)	text_typebinary_type)	to_native)download_updates_filec                       e Zd Zy)!FailedInstallingWithPluginManagerN)__name__
__module____qualname__     t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/jenkins_plugin.pyr   r   I  s    r   r   c                       e Zd Zd Zd Zd ZddZ	 	 d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)JenkinsPluginc                 P   || _         | j                   j                  | _        | j                  d   | _        | j                  d   | _        i | _        d | _        | j                         r.t        j                         | _        | j                         | _        | j                          y )Nurltimeout)moduleparamsr   r   crumbcookies_csrf_enabled	cookiejarLWPCookieJar
_get_crumb_get_installed_plugins)selfr   s     r   __init__zJenkinsPlugin.__init__N  s     kk((;;u%{{9- 
$113DL*DJ 	##%r   c                     | j                  | j                  ddd      }d|vr| j                  j                  d|       |d   S )N/zapi/jsonCSRF	useCrumbsz1Required fields not found in the Crumbs response.msgdetails_get_json_datar   r   	fail_json)r&   	csrf_datas     r   r!   zJenkinsPlugin._csrf_enabledc  sT    ''xx,f6	 i'KK!!G! " # %%r   c                     | j                   ||fi |}	 t        j                  t        |j	                                     }|S # t
        $ r4}| j                  j                  d|z  t        |             Y d }~S d }~ww xY w)NzCannot parse %s JSON data.r,   )_get_url_datajsonloadsr   read	Exceptionr   r1   )r&   r   whatkwargsr	json_dataes          r   r0   zJenkinsPlugin._get_json_datan  s    DsD3F3	&

9QVVX#67I   	&KK!!047!! " & & 	&s   ,A 	B)A<<BNc           	         |d|z  }|d|z  }i }|D ]  }d }	 | j                   j                  d|z         t        | j                   |f| j                  | j                  | j
                  d|\  }	}
|
d   dk(  r)|	|#| j                   j                  |       |||<   c S c S |d|d|
d   }|
d   d	kD  r
|d
|
d   }|| j                   j                  |       |||<    | j                   j                  ||       y # t        $ r}|d|dt        |      }Y d }~dd }~ww xY w# |!| j                   j                  |       |||<   w w xY w)NCannot get %sRetrieval of %s failed.zfetching url: %sr   r    headersstatus   z. fetching url z failed. response code: i  z. response body: bodyz failed. error msg: r,   )	r   debugr
   r   r    r   r8   r   r1   )r&   urlsr9   
msg_statusmsg_exceptionr:   errorsr   err_msgresponseinfor=   s               r   _get_urls_datazJenkinsPlugin._get_urls_data|  s   (4/J 5<M 	*CG*!!"4s":;!*KK"2.2llDLL JJ"2*0"2$ >S(# &KK%%g.")F3K ' S]^acghpcqrGH~+=Dd6l"S &KK%%g.")F3K'	*, 	-@  hISUXZcdeZfgh &KK%%g.")F3K 's0   A#D$D	D,D'"D/'D,,D//%Ec                    |d|z  }|d|z  }	 t        | j                  |f| j                  | j                  | j                  d|\  }}|d   dk7  r0|rt        |d         | j                  j                  ||d          |S # t        $ r>}	|rt        |	      | j                  j                  |t        |	             Y d }	~	S d }	~	ww xY w)Nr?   r@   rA   rC   rD   r-   r,   )	r
   r   r   r    r   r   r1   r8   r   )
r&   r   r9   rH   rI   	dont_failr:   rL   rM   r=   s
             r   r4   zJenkinsPlugin._get_url_data  s     (4/J 5<M	O&S.*.,,

.&,.NHd H~$;DKHHKK))j$u+)N   	O7::%%-1%NN	Os   A4B 	C3CCc                     | j                  | j                  ddd      }d|v rd|v r|d   |d   i}|S | j                  j                  d|       S )Nr)   zcrumbIssuer/api/jsonCrumbcrumbRequestFieldr   z/Required fields not found in the Crum response.r,   r/   )r&   
crumb_datarets      r   r$   zJenkinsPlugin._get_crumb  sw    ((xx!78'C
 *,J1F./G1DC 
	 KK!!E" " $ 
r   c                 0   | j                  | j                  ddd      }d|vr| j                  j                  d       d| _        d| _        d| _        |d   D ]8  }|d   | j                  d	   k(  sd
| _        |d   rd
| _        |d   rd
| _         y  y )Nr)   zpluginManager/api/json?depth=1zlist of pluginspluginszNo valid plugin data found.r-   F	shortNamenameTpinnedenabled)r0   r   r   r1   is_installed	is_pinned
is_enabledr   )r&   plugins_dataps      r   r%   z$JenkinsPlugin._get_installed_plugins  s    **xx!AB
 L(KK!!&C!D "i( 
	A~V!44$(!X;%)DNY<&*DO
	r   c                    | j                   j                  sd| j                  d   z  }| j                  d   rd| j                  d   d|}d|i}t        |      }| j	                  d| j
                  z  dd	|d
      }| j                  d   d| j                  d   d}t        j                  j                  |      rt        j                  |       y y y )NzDd = Jenkins.instance.updateCenter.getPlugin("%s").deploy(); d.get();rZ   with_dependenciesz)Jenkins.instance.updateCenter.getPlugin("z.").getNeededDependencies().each{it.deploy()}; scriptz%s/scriptTextzCannot install plugin.zPlugin installation has failed.T)rH   rI   datarP   jenkins_home	/plugins/z.hpi)
r   
check_moder   r	   r4   r   ospathisfileremove)r&   install_scriptscript_datare   r;   hpi_files         r   _install_with_plugin_managerz*JenkinsPlugin._install_with_plugin_manager  s    {{%%&(,F(;<  {{./ F+^=  .K [)D ""$((*3? #  A N+F#%H ww~~h'		(# (; &r   c                 :   d}| j                   d   d| j                   d   d}| j                  s$| j                   d   dv r	 | j                          d}|st        j
                  j                  | j                   d         s| j                  j                  d	
       d }t        j
                  j                  |      rHt        |d      5 }|j                         }d d d        t        j                        j                         }| j                   d   dv r| j                         }n| j!                         }| j                   d   dk(  s| j                   d   dvs|| j#                  |      }|+| j                  j$                  s| j'                  ||       d}n|j                         }t        j                  |      j                         }	||	k7  r| j                  j$                  s| j'                  ||       d}nn| j                   d   dk(  r\| j)                         }
|t+        |
d         k7  r;| j                  j$                  s#| j#                  |      }| j'                  ||       d}t        j
                  j                  |      rpd|i}|j-                  | j                          | j                  j/                  |      }| j                  j$                  s| j                  j1                  ||      }|S d}|S # t        $ r Y w xY w# 1 sw Y   4xY w)NFrf   rg   rZ   z.jpiversion)NlatestTz%Jenkins home directory doesn't exist.rX   rbupdates_expirationr   rs   sha1dest)r   r]   rp   r   ri   rj   isdirr   r1   rk   openr7   hashlibrv   	hexdigest_get_latest_plugin_urls_get_versioned_plugin_urls_download_pluginrh   _write_file_download_updatesr   updateload_file_common_argumentsset_fs_attributes_if_different)r&   changedplugin_filechecksum_old	plugin_fhplugin_contentplugin_urlsr;   re   checksum_newplugin_datar   	file_argss                r   installzJenkinsPlugin.install  s    N+F#% 	
   T[[%;?O%O113 77==^!<=%%? & A  Lww~~k*+t, 6	%.^^%5N6&||N;EEG{{9%)99"::< #==?KK 45:KK	*2BB ( ))+6  ';;11((a8"G 668D $+<<#5#?#?#AL $|3#{{55 ,,[$?"&Y'83"446  8K,?#@@;;11 11+>((a8"G 77>>+&F MM$++&>>vFI;;))++DDw(  _ 5 6 6s   L  L 	LLLc           
          g }| j                   d   D ]E  }| j                   d   D ]1  }|j                  dj                  ||| j                   d                3 G |S )Nupdates_urllatest_plugins_url_segmentsz{0}/{1}/{2}.hpirZ   r   appendformat)r&   rG   base_urlupdate_segments       r   r|   z%JenkinsPlugin._get_latest_plugin_urls`  si    M2 	eH"&++.K"L e-44X~t{{[aObcde	e r   c                     g }| j                   d   D ]S  }| j                   d   D ]?  }|j                  dj                  ||| j                   d   | j                   d                A U |S )Nr   versioned_plugins_url_segmentsz{0}/{1}/{2}/{3}/{2}.hpirZ   rr   r   )r&   rG   r   versioned_segments       r   r}   z(JenkinsPlugin._get_versioned_plugin_urlsg  s    M2 	HH%)[[1Q%R H!5<<XGXZ^ZeZeflZmosozoz  |E  pF  G  HH	H r   c                     g }| j                   d   D ]7  }| j                   d   D ]#  }|j                  dj                  ||             % 9 |S )Nr   update_json_url_segmentz{0}/{1}r   )r&   rG   r   update_jsons       r   _get_update_center_urlsz%JenkinsPlugin._get_update_center_urlsn  s\    M2 	EH#{{+DE EI,,X{CDE	E r   c                 D   	 t        | j                  d         \  }}rv| j                         }| j                  |dd      }t        j                         \  }}t        j                  ||j                                	 t        j                  |       n}	 t        j                   |d	      }|j#                         }	t%        j&                  |j#                               }
|k7  rV| j                  j+                  t        j,                  j/                  |      t        j,                  j/                  |             
j1                  di       j1                  | j                  d         s| j                  j	                  d       |
d   | j                  d      S # t        $ r1}| j                  j	                  dt        |             Y d }~d }~ww xY w# t        $ r4}| j                  j	                  d|z  t        |             Y d }~zd }~ww xY w# t        $ r;}| j                  j	                  d
|k7  rdndz  t        |             Y d }~vd }~wt(        $ r;}| j                  j	                  d|k7  rdndz  t        |             Y d }~d }~ww xY w)Nru   z!Cannot create temporal directory.r,   zRemote updates not found.zUpdates download failed.rH   rI   z%Cannot close the tmp updates file %s.zutf-8)encodingzCannot open%s updates file.z
 temporary z.Cannot load JSON data from the%s updates file.rW   rZ   z,Cannot find plugin data in the updates file.rX   )r   r   OSErrorr   r1   r   r   rN   tempfilemkstempri   writer7   closeIOErroriory   readliner5   r6   r8   atomic_moverj   abspathget)r&   updates_filedownload_updatesr=   rG   r;   tmp_update_fdtmp_updates_filefdummyre   s              r   r   zJenkinsPlugin._download_updatesu  sa   	&-B4;;OcCd-e*L* //1D ##68 $ :A /7.>.>.@+M+HH]AFFH-*'  ,	&(7;A JJLE::ajjl+D |+KK##BGGOO4D$ErwwWcGde xx	2&**4;;v+>?KK!!&T!UIt{{6233i  	&KK!!7!! " & &	&*  *%%?BRR%aL & * **  	&KK!!1EUYeEe\kmn!! " & &  	&KK!!DXhlxXx  A  B!! " & &	&sT   F ?G A
H 	G%&GG	H")HH	J"0IJ$0JJc                 *    | j                  |dd      S )NzPlugin not found.zPlugin download failed.r   )rN   )r&   r   s     r   r~   zJenkinsPlugin._download_plugin  s%     ""*3 # 5 	5r   c                 *   t        j                         \  }}t        |t        t        f      rt        j                  ||       n$t        j                  ||j                                	 t        j                  |       | j                  j                  t
        j                  j                  |      t
        j                  j                  |             y # t        $ r3}| j                  j                  d|z  t        |             Y d }~d }~ww xY w)Nz)Cannot close the temporal plugin file %s.r,   )r   r   
isinstancer   r   ri   r   r7   r   r   r   r1   r   r   rj   r   )r&   r   re   tmp_f_fdtmp_fr=   s         r   r   zJenkinsPlugin._write_file  s    "**,%dY45HHXt$HHXtyy{+	&HHX 	 68JK  	&KK!!?%G!! " & &	&s   *C 	D)DDc                 v    d}| j                   r*| j                  j                  s| j                  dd       d}|S )NFdoUninstallUninstallationT)r]   r   rh   	_pm_query)r&   r   s     r   	uninstallzJenkinsPlugin.uninstall  s8     ;;))}.>?Gr   c                 $    | j                  d      S )Npin_pinningr&   s    r   r   zJenkinsPlugin.pin  s    }}U##r   c                 $    | j                  d      S )Nunpinr   r   s    r   r   zJenkinsPlugin.unpin  s    }}W%%r   c                     d}|dk(  r| j                   r|dk(  rG| j                   r;| j                  j                  s#| j                  |d|j	                         z         d}|S )NFr   r   z%sningT)r^   r   rh   r   
capitalizer&   actionr   s      r   r   zJenkinsPlugin._pinning  sY     %'!dnn ;;))vx&2C2C2E'EFGr   c                 $    | j                  d      S )Nenable	_enablingr   s    r   r   zJenkinsPlugin.enable  s    ~~h''r   c                 $    | j                  d      S )Ndisabler   r   s    r   r   zJenkinsPlugin.disable  s    ~~i((r   c                     d}|dk(  r| j                   r|dk(  r[| j                   rO| j                  j                  s7| j                  d|j	                         z  d|d d j	                         z         d}|S )NFr   r   zmake%sdz%singT)r_   r   rh   r   r   r   s      r   r   zJenkinsPlugin._enabling  st     ("4??)# ;;)) 1 1 33fSbk44668 Gr   c                     | j                   d   d| j                   d   d|}| j                  |d|z  d|z  d       y )	Nr   z/pluginManager/plugin/rZ   r)   zPlugin not found. %sz%s has failed.POST)rH   rI   method)r   r4   )r&   r   r-   r   s       r   r   zJenkinsPlugin._pm_query  sM    KKF 3V= 	-3*S0	 	 	r   )NNN)NNNF)r   r   r   r'   r!   r0   rN   r4   r$   r%   rp   r   r|   r}   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   M  s    &*	&AD BF:4$BZx74r5L&
$& ()$	r   r   c                     t               } | j                  t        dd      t        dd      t        dd      t        dd	
      t        dd      t        g dd      t        dd      t        dd      t        ddddg      t        ddddg      t        dddg      t        ddddg      t        d      t        d	      t               t        d	d             t        | d	d	      }d	|j                  d <   	 t        |j                  d!         |j                  d!<   |j                  d$   dk(  rd|j                  d$<   d|j                  d%<   |j                  d&   }|j                  d$   }d'}t        |      }|dk(  r|j                         }nm|d(k(  r|j                         }nW|d)k(  r|j                         }nA|d*k(  r|j                         }n+|d+k(  r|j                         }n|d,k(  r|j                         }|j!                  |||-       y # t        $ r7}|j                  d"|j                  d!   z  t        |      #       Y d }~.d }~ww xY w).Nstrjenkins)typedefaultrj   z/var/lib/jenkins0644raw)r   r   T)r   required)presentabsentr[   unpinnedr\   disabledrs   r   )choicesr      intiQ listzhttps://updates.jenkins.iozhttp://mirrors.jenkins.io)r   elementsr   zupdate-center.jsonzupdates/update-center.jsonrs   zdownload/pluginsrW   zhttp://localhost:8080)r   )no_logbool)grouprf   moderZ   ownerstater   ru   r   r   r   r   r   url_passwordrr   rc   )argument_specadd_file_common_argssupports_check_modeforce_basic_authr   zCannot convert %s to float.r,   r   rr   rZ   Fr   r[   r   r\   r   )r   pluginr   )r   r   dictr   r   float
ValueErrorr1   r   r   r   r   r   r   r   r   	exit_json)r   r   r=   rZ   r   r   jps          r   mainr     sa   %'My1v/AB&u-ut,y1 	 Re,E:fu?[?Z?\ ] $&5K_KgKi !j$(fuxj$Y'+%RdfoQp'q01&t&97  < #! F )-FMM$%"#(y)A#Bi  }}W)!*g#+i  == DMM'"E G 
v	B 	**,	(	,,.	(	&&(	*	((*	)	))+	*	**, WT?G  "-i0HHaL 	 	" 	""s   %H 	I#,II__main__)&
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNrz   r   r5   ri   r   ansible.module_utils.basicr   r   ansible.module_utils.six.movesr   r"   +ansible.module_utils.six.moves.urllib.parser	   ansible.module_utils.urlsr
   r   ansible.module_utils.sixr   r   +ansible.module_utils.common.text.convertersr   Bansible_collections.community.general.plugins.module_utils.jenkinsr   r8   r   objectr   r   r   r   r   r   <module>r     s    A @wreN
  	  	  > F A B ; A d		 	F DP@f zF r   