a ì)gîBã@s¾ddlmZmZmZeZdZdZdZddl Z ddl Z ddl Z ddl m Z ddlmZGdd „d eƒZGd d „d eƒZGd d „d eƒZGdd„deƒZGdd„deƒZdd„ZedkrºeƒdS)é)Úabsolute_importÚdivisionÚprint_functionak --- module: service_facts short_description: Return service state information as fact data description: - Return service state information as fact data for various service management utilities. version_added: "2.5" requirements: ["Any of the following supported init systems: systemd, sysv, upstart, openrc, AIX SRC"] extends_documentation_fragment: - action_common_attributes - action_common_attributes.facts attributes: check_mode: support: full diff_mode: support: none facts: support: full platform: platforms: posix notes: - When accessing the C(ansible_facts.services) facts collected by this module, it is recommended to not use "dot notation" because services can have a C(-) character in their name which would result in invalid "dot notation", such as C(ansible_facts.services.zuul-gateway). It is instead recommended to using the string value of the service name as the key in order to obtain the fact data value like C(ansible_facts.services['zuul-gateway']) - AIX SRC was added in version 2.11. author: - Adam Miller (@maxamillion) z— - name: Populate service facts ansible.builtin.service_facts: - name: Print service facts ansible.builtin.debug: var: ansible_facts.services a ansible_facts: description: Facts to add to ansible_facts about the services on the system returned: always type: complex contains: services: description: States of the services with service name as key. returned: always type: complex contains: source: description: - Init system of the service. - One of C(rcctl), C(systemd), C(sysv), C(upstart), C(src). returned: always type: str sample: sysv state: description: - State of the service. - 'This commonly includes (but is not limited to) the following: C(failed), C(running), C(stopped) or C(unknown).' - Depending on the used init system additional states might be returned. returned: always type: str sample: running status: description: - State of the service. - Either C(enabled), C(disabled), C(static), C(indirect) or C(unknown). returned: systemd systems or RedHat/SUSE flavored sysvinit/upstart or OpenBSD type: str sample: enabled name: description: Name of the service. returned: always type: str sample: arp-ethers.service N)Ú AnsibleModule)Úget_best_parsable_localec@seZdZdd„ZdS)Ú BaseServicecCs ||_dS)N)Úmodule)Úselfr©r úA/usr/lib/python3.9/site-packages/ansible/modules/service_facts.pyÚ__init__eszBaseService.__init__N)Ú__name__Ú __module__Ú __qualname__r r r r r rcsrc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚServiceScanServicec Cs¢|j d|j¡\}}}|dkr0tj d¡s0dS|dkrL|j d||f¡tjdtj d}|  |¡D]6}|  d¡}|  d ¡d krˆd }nd }||d dœ||<qfdS)Nz%s --status-alléz /etc/init.drz'Unable to query 'service' tool (%s): %sz*^\s*\[ (?P\+|\-) \]\s+(?P.+)$)ÚflagsÚnameÚstateú+ÚrunningÚstoppedÚsysv©rrÚsource) rÚ run_commandÚ service_pathÚosÚpathÚexistsÚwarnÚreÚcompileÚMÚfinditerÚgroup) r ÚservicesÚrcÚstdoutÚstderrÚpÚmatchÚ service_nameÚ service_stater r r Ú_list_sysvinitks z!ServiceScanService._list_sysvinitcCsºt d¡}|j d|j¡\}}}|dkr<|j d|¡nz| dd¡}| d¡D]b}| |¡}|sfqR|  d¡} |  d ¡} |  d ¡} |  d ¡rš|  d ¡} nd} | | | d d œ} | || <qRdS)NzR^\s?(?P.*)\s(?P\w+)\/(?P\w+)(\,\sprocess\s(?P[0-9]+))?\s*$z%s listrz,Unable to query upstart for service data: %sú ÚÚ rÚgoalrÚpidZupstart)rrr2r) r!r"rrÚ initctl_pathr ÚreplaceÚsplitr+r%)r r&r*r'r(r)Z real_stdoutÚlineÚmr,Z service_goalr-r3Zpayloadr r r Ú _list_upstart~s"        z ServiceScanService._list_upstartcCsˆt d¡}|jjd|jdd\}}}d}| d¡D]}| |¡r4d}q4|s¾t d¡}d}| d¡D]}| |¡rdd}qd|rš|jjd|jdd\}}}n$d |vr¾|jjd |jdd\}}}| d¡D]º}| |¡} | rÈ|  d ¡} d } d } |  d¡dkrd} |jjd|j| fdd\}}}|} |dvr4d} n8|  ¡} dD]&}|| vr@|j  d| ¡qlq@d } | | | ddœ}||| <qÈdS)Nz¸(?P.*?)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)\s+[0-9]:(?Pon|off)z%sT©Zuse_unsafe_shellFr1z"(?P.*?)\s+(?Pon|off)z%s -l --allservicesz--listz %s --listÚservicerÚdisabledZrl3ÚonÚenabledz %s %s status)rr)ÚrootZ permissionznot in sudoerszDInsufficient permissions to query sysV service "%s" and their statesr©rrÚstatusr) r!r"rrÚchkconfig_pathr6r+r%rÚlowerr )r r&r*r'r(r)Z match_anyr7Zp_simpler8r,r-Zservice_statusÚoutputÚxÚ service_datar r r Ú_list_rh“sLÿ         zServiceScanService._list_rhcCsîi}|jjd|jdd\}}}|jjd|jdd\}}}| d¡D]N} |  d¡} t| ƒdkrbqF| d ¡} | d  ¡} | sˆd|| <qF|  ¡|| <qF| d¡D]H} |  ¡} t| ƒdkrºq | d} | d } || }| || d d œ}||| <q dS) Nz)%s -a -s -m 2>&1 | grep '^ ' | tr -d '[]'Tr:z%s show -v 2>&1 | grep '|'r1ú|éréZopenrc)rÚ runlevelsrr)rrÚrc_status_pathÚrc_update_pathr6ÚlenÚstrip)r r&Zall_services_runlevelsr'r(r)Zrc_uZstdout_uZstderr_ur7Ú line_datar,rKr-Zservice_runlevelsrFr r r Ú _list_openrcÄs*      zServiceScanService._list_openrccCs¾i}|j d¡|_|j d¡|_|j d¡|_|j d¡|_|j d¡|_|jrn|jdurn|jdurn| |¡|jrŠ|jdurŠ| |¡n0|jrœ|  |¡n|jdurº|jdurº|  |¡|S)Nr;Z chkconfigZinitctlz rc-statusz rc-update) rÚ get_bin_pathrrBr4rLrMr.r9rGrQ)r r&r r r Úgather_servicesÜs    z"ServiceScanService.gather_servicesN)r rrr.r9rGrQrSr r r r ris 1rc@s8eZdZegd¢ƒZdd„Zdd„Zdd„Zdd „Zd S) ÚSystemctlScanService)z not-foundZmaskedÚfailedcCs@ztddƒ}Wnty"YdS0|D]}d|vr(dSq(dS)Nz /proc/1/commÚrFÚsystemdT)ÚopenÚIOError)r Úfr7r r r Úsystemd_enabledös z$SystemctlScanService.systemd_enabledc Cs¼|jjd|dd\}}}|dkr4|j d|¡n„dd„| d¡DƒD]n}d }d }| ¡} |jD] } | | vrb| }| d d…} qŒqb| d }| d} | d dkr¤d}| ||ddœ|| <qHdS)Nz-%s list-units --no-pager --type service --allTr:rz%Could not list units from systemd: %scSsg|]}d|vr|‘qS©z.servicer ©Ú.0Zsvc_liner r r Ú óz9SystemctlScanService._list_from_units..r1rÚunknownrJrIérrWr@)rrr r6Ú BAD_STATES) r Úsystemctl_pathr&r'r(r)r7Z state_valÚ status_valÚfieldsZbadr,r r r Ú_list_from_unitss"   z%SystemctlScanService._list_from_unitsc Cs |jjd|dd\}}}|dkr4|j d|¡nÒdd„| d¡DƒD]¼}z| ¡dd …\}}Wn&tyŠ|jjd  |¡d Yn0||vræ|jjd ||fdd\}}}d } |sÒ|dkrÒ| dd¡ ¡} || |ddœ||<qH||d|j vrH|||d<qHdS)Nz2%s list-unit-files --no-pager --type service --allTr:rz.Could not get unit files data from systemd: %scSsg|]}d|vr|‘qSr\r r]r r r r_%r`z>SystemctlScanService._list_from_unit_files..r1rIz=Malformed output discovered from systemd list-unit-files: {0})Úmsgz!%s show %s --property=ActiveStaterar0z ActiveState=rWr@rA) rrr r6Ú IndexErrorZ fail_jsonÚformatr5Úrstriprc) r rdr&r'r(r)r7r,rerr r r Ú_list_from_unit_filess   z*SystemctlScanService._list_from_unit_filescCs@i}| ¡r<|jjdddgd}|r<| ||¡| ||¡|S)NZ systemctlz/usr/binz/usr/local/bin)Zopt_dirs)r[rrRrgrl)r r&rdr r r rS4s  z$SystemctlScanService.gather_servicesN) r rrÚ frozensetrcr[rgrlrSr r r r rTòs   rTc@seZdZdd„ZdS)ÚAIXScanServicec CsÌi}t ¡dkrÈ|j d¡}|rÈ|j d|¡\}}}|dkrT|j d||f¡nt| d¡D]h}| ¡}t|ƒdkrxq^|ddkr†q^|d}|d d kr d } n|d d kr²d } nd} || ddœ||<q^|S)NZAIXZlssrcz%s -arz.lssrc could not retrieve service data (%s): %sr1rIZ SubsysteméÿÿÿÿZactiverZ inoperativerraÚsrcr)ÚplatformÚsystemrrRrr r6rN) r r&Z lssrc_pathr'r(r)r7rPr,r-r r r rSBs*      zAIXScanService.gather_servicesN)r rrrSr r r r rn@srnc@seZdZdd„Zdd„ZdS)ÚOpenBSDScanServicecCsdg}|j d|j|f¡\}}}d| ¡vr:|j d¡n&| d¡D]}|dkrTqDqD| |¡qD|S)Nz%s ls %szneeds root privilegeszrcctl requires root privilegesr1r0)rrÚ rcctl_pathrCr r6Úappend)r ÚcmdZsvcsr'r(r)Úsvcr r r Ú query_rcctl_s  zOpenBSDScanService.query_rcctlcsÄi‰|j d¡|_|jrÀ| d¡D]}|ddœˆ|<q"| d¡D]}ˆ| ddi¡q@| d¡D]}ˆ| dd i¡qb‡fd d „ˆDƒ‡fd d „ˆDƒ| d ¡D]}ˆ| dd i¡q¨ˆS)NZrcctlÚall)rrr=rAr>Ústartedrrcs0g|](}ˆ| d¡durˆ| ddi¡‘qS)rANr<©ÚgetÚupdate©r^rw©r&r r r_|r`z6OpenBSDScanService.gather_services..cs0g|](}ˆ| d¡durˆ| ddi¡‘qS)rNrr{r~rr r r_r`rU)rrRrtrxr})r rwr rr rSlsz"OpenBSDScanService.gather_servicesN)r rrrxrSr r r r rs]s rscCsšttƒdd}t|ƒ}t||d|_ttttf}i}|D]"}||ƒ}| ¡}|r8|  |¡q8t |ƒdkrvtddd}ntt|dd}|j fi|¤ŽdS) NT)Z argument_specZsupports_check_mode)ÚLANGÚLC_ALLrz]Failed to find any services. This can be due to privileges or some other configuration issue.)Zskippedrhr)Z ansible_facts) rÚdictrZrun_command_environ_updaterrTrnrsrSr}rNZ exit_json)rÚlocaleZservice_modulesZ all_servicesZ svc_moduleZsvcmodrwÚresultsr r r Úmainˆs   r…Ú__main__)Z __future__rrrÚtypeZ __metaclass__Z DOCUMENTATIONZEXAMPLESZRETURNrrqr!Zansible.module_utils.basicrZ"ansible.module_utils.common.localerÚobjectrrrTrnrsr…r r r r r Ús$  )   N+