
    VhG                        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  G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Zd Zedk(  r e        yy)    )annotationsal  
---
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 RV(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)
a  
- name: Populate service facts
  ansible.builtin.service_facts:

- name: Print service facts
  ansible.builtin.debug:
    var: ansible_facts.services

- name: show names of existing systemd services, sometimes systemd knows about services that were never installed
  debug: msg={{ existing_systemd_services | map(attribute='name') }}
  vars:
     known_systemd_services: "{{ ansible_facts['services'].values() | selectattr('source', 'equalto', 'systemd') }}"
     existing_systemd_services: "{{ known_systemd_services | rejectattr('status', 'equalto', 'not-found') }}"

- name: restart systemd service if it exists
  service:
    state: restarted
    name: ntpd.service
  when: ansible_facts['services']['ntpd.service']['status'] | default('not-found') != 'not-found'

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: list
      elements: dict
      contains:
        source:
          description:
          - Init system of the service.
          - One of V(rcctl), V(systemd), V(sysv), V(upstart), V(src).
          returned: always
          type: str
          sample: sysv
        state:
          description:
          - State of the service.
          - 'This commonly includes (but is not limited to) the following: V(failed), V(running), V(stopped) or V(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 V(enabled), V(disabled), V(static), V(indirect) or V(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_locale)is_systemd_managedc                      e Zd Zd Zy)BaseServicec                    || _         y N)module)selfr   s     M/home/dcms/DCMS/lib/python3.12/site-packages/ansible/modules/service_facts.py__init__zBaseService.__init__s   s	        N)__name__
__module____qualname__r    r   r   r   r   q   s    r   r   c                  *    e Zd Zd Zd Zd Zd Zd Zy)ServiceScanServicec                   | j                   j                  d| j                  z        \  }}}|dk(  r t        j                  j                  d      sy |dk7  r!| j                   j                  d|d|       t        j                  dt        j                        }|j                  |      D ]5  }|j                  d	      }|j                  d
      dk(  rd}nd}||dd||<   7 y )Nz%s --status-all   z/etc/init.dr   z Unable to query 'service' tool (): z*^\s*\[ (?P<state>\+|\-) \]\s+(?P<name>.+)$)flagsnamestate+runningstoppedsysvr   r   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_states	            r   _list_sysvinitz!ServiceScanService._list_sysvinity   s    ![[445FIZIZ5Z[FF7277>>-8
 7KK"fUVJJDBDDQZZ' 	fE ;;v.L{{7#s* ) ).:]^d%eH\"	fr   c                   t        j                  d      }| j                  j                  d| j                  z        \  }}}|dk7  r| j                  j                  d|z         y |j                  dd      }|j                  d      D ]z  }|j                  |      }|s|j                  d      }	|j                  d	      }
|j                  d
      }|j                  d      r|j                  d      }nd }|	||
dd}|||	<   | y )NzR^\s?(?P<name>.*)\s(?P<goal>\w+)\/(?P<state>\w+)(\,\sprocess\s(?P<pid>[0-9]+))?\s*$z%s listr   z,Unable to query upstart for service data: %s 
r   goalr   pidupstart)r   r   r:   r!   )
r(   r)   r   r"   initctl_pathr'   replacesplitr2   r,   )r   r-   r1   r.   r/   r0   real_stdoutlinemr3   service_goalr4   r;   payloads                 r   _list_upstartz ServiceScanService._list_upstart   s    JJlm![[44YARAR5RSFF7KKKfTU ..r2K#))$/ 1GGDM wwv wwv ! 0775>''%.CC#/-Q]irs)0&1r   c                   t        j                  d      }| j                  j                  d| j                  z  d      \  }}}d}|j                  d      D ]  }|j                  |      sd} |st        j                  d      }d}|j                  d      D ]  }|j                  |      sd} |r/| j                  j                  d| j                  z  d      \  }}}n2d	|v r.| j                  j                  d
| j                  z  d      \  }}}|j                  d      D ]  }|j                  |      }	|	s|	j                  d      }
d}d}|	j                  d      dk(  rd}| j                  j                  | j                  d|
dd      \  }}}|}|dv rd}n=|j                         }dD ]&  }||v s| j                  j                  d|
z          n d}|
||dd}|||
<    y )Nz(?P<service>.*?)\s+[0-9]:(?P<rl0>on|off)\s+[0-9]:(?P<rl1>on|off)\s+[0-9]:(?P<rl2>on|off)\s+[0-9]:(?P<rl3>on|off)\s+[0-9]:(?P<rl4>on|off)\s+[0-9]:(?P<rl5>on|off)\s+[0-9]:(?P<rl6>on|off)z%sTuse_unsafe_shellFr9   z"(?P<service>.*?)\s+(?P<rl0>on|off)z%s -l --allservicesz--listz	%s --listservicer   disabledrl3onenabled z status)r   r   )root
permissionznot in sudoerszDInsufficient permissions to query sysV service "%s" and their statesr   r   r   statusr!   )r(   r)   r   r"   chkconfig_pathr?   r2   r,   r#   lowerr'   )r   r-   r1   r.   r/   r0   	match_anyrA   p_simplerB   r3   r4   service_statusoutputxservice_datas                   r   _list_rhzServiceScanService._list_rh   s"   JJmn "[[44TD<O<O5Obf4gFF	LL& 	!Dwwt} 		! zz"GHHIT* %>>$' $I% %)[[%<%<=RUYUhUh=h{%<  &A"FFV#%)[[%<%<[4K^K^=^qu%<%v"FFLL& 	6DA wwy1 )!+775>T)%.N%)[[%<%<tO`O`bn=o  CG%<  &H"FF ":$-M $\\^FE 2; KK,,-s  wC  .C  D!2
 )2(4}Xfrxy)5&/	6r   c                N   i }| j                   j                  d| j                  z  d      \  }}}| j                   j                  d| j                  z  d      \  }}}|j	                  d      D ]c  }	|	j	                  d      }
t        |
      dk  r#|
d   j                         }|
d	   j                         }|sd ||<   Q|j	                         ||<   e |j	                  d      D ]<  }	|	j	                         }
t        |
      dk  r"|
d   }|
d	   }||   }|||d
d}|||<   > y )Nz)%s -a -s -m 2>&1 | grep '^ ' | tr -d '[]'TrG   z%s show -v 2>&1 | grep '|'r9   |   r      openrc)r   	runlevelsr   r!   )r   r"   rc_status_pathrc_update_pathr?   lenstrip)r   r-   all_services_runlevelsr.   r/   r0   rc_ustdout_ustderr_urA   	line_datar3   ra   r4   service_runlevelsrZ   s                   r   _list_openrczServiceScanService._list_openrc   sX   !#![[445`cgcvcv5v  JN4  OFF#';;#:#:;WZ^ZmZm;m  AE#:  $F hNN4( 		ID

3I9~!$Q<--/L!!**,I7;&|47@7H&|4		I LL& 	2D

I9~!$Q<L%aLM 6| D$0?P[ht|}L%1H\"	2r   c                   i }| j                   j                  d      | _        | j                   j                  d      | _        | j                   j                  d      | _        | j                   j                  d      | _        | j                   j                  d      | _        | j                  r)| j                  | j
                  | j                  |       | j                  r| j                  | j                  |       |S | j                  r| j                  |       |S | j
                  | j                  | j                  |       |S )NrI   	chkconfiginitctlz	rc-statusz	rc-update)r   get_bin_pathr#   rS   r=   rb   rc   r5   rE   r[   rl   )r   r-   s     r   gather_servicesz"ServiceScanService.gather_services   s    !KK44Y?"kk66{C KK44Y?"kk66{C"kk66{C !4!4!<ATATA\)!4!4!<x(
 	   MM(#    ,1D1D1Ph'r   N)r   r   r   r5   rE   r[   rl   rq   r   r   r   r   r   w   s    f&1*/6b20r   r   c                  8    e Zd Z eg d      Zd Zd Zd Zd Zy)SystemctlScanService)z	not-foundmaskedfailedc                ,    t        | j                        S r
   )r   r   )r   s    r   systemd_enabledz$SystemctlScanService.systemd_enabled  s    !$++..r   c                   | j                   j                  d|z  d      \  }}}|dk7  r| j                   j                  d|z         y |j                  d      D cg c]	  }d|v s| c}D ]P  }d}d	}	|j                         }
| j                  D ]  }||
d d
 v s|}	 n |
d   }	|
d   }|
d   dk(  rd}|||	dd||<   R y c c}w )Nz5%s list-units --no-pager --type service --all --plainTrG   r   z%Could not list units from systemd: %sr9   .servicer   unknownr^      r   systemdrQ   )r   r"   r'   r?   
BAD_STATES)r   systemctl_pathr-   r.   r/   r0   svc_linerA   	state_val
status_valfieldsbadr3   s                r   _list_from_unitsz%SystemctlScanService._list_from_units  s     "[[445lo}5}  QU4  VFF7KKDvMN28,,t2D_h
V^H^_ %	&
  ?? +CfSbk)%(
	+ "(J%ay!9	) )I2>^ht})~&+_s   	C&Cc                   | j                   j                  d|z  d      \  }}}|dk7  r| j                   j                  d|z         y |j                  d      D cg c]	  }d|v s| c}D ]  }	 |j                         d d \  }}	|vr[| j                   j                  |d|dd      \  }}}d}
|s%|dk7  r |j                  dd      j                         }
||
	dd||<   y||   d   | j                  vs	||   d<    y c c}w # t        $ r. | j                   j                  d	j                  |      
       Y w xY w)Nz2%s list-unit-files --no-pager --type service --allTrG   r   z.Could not get unit files data from systemd: %sr9   ry   r^   z=Malformed output discovered from systemd list-unit-files: {0})msgz show z --property=ActiveStaterz   r8   zActiveState=r}   rQ   rR   )
r   r"   r'   r?   
IndexError	fail_jsonformatr>   rstripr~   )r   r   r-   r.   r/   r0   r   rA   r3   r   r   s              r   _list_from_unit_filesz*SystemctlScanService._list_from_unit_files%  sw    "[[445ilz5z  NR4  SFF7KKMPVVW28,,t2D_h
V^H^_ B|/3zz|BQ/?,L*  x/)-)@)@hv  yE  BF  Y])@  *^&B%E&B, &~r B I I K6BU^ht}-~H\*l+H5T__L7AH\*84B_ " |KK)).m.t.tuy.z){|s   	D&D1D4EEc                    i }| j                         rE| j                  j                  dddg      }|r$| j                  ||       | j	                  ||       |S )N	systemctlz/usr/binz/usr/local/bin)opt_dirs)rw   r   rp   r   r   )r   r-   r   s      r   rq   z$SystemctlScanService.gather_services;  sZ    !![[55kZYiLj5kN%%nh?**>8Dr   N)	r   r   r   	frozensetr~   rw   r   r   rq   r   r   r   rs   rs      s#    <=J/<B,	r   rs   c                      e Zd Zd Zy)AIXScanServicec                   i }t        j                         dk(  r| j                  j                  d      }|r| j                  j	                  d|z        \  }}}|dk7  r#| j                  j                  d|d|       |S |j                  d      D ]P  }|j                         }t        |      dk  r"|d   d	k(  r+|d   }|d
   dk(  rd}	n|d
   dk(  rd}	nd}	||	dd||<   R |S )NAIXlssrcz%s -ar   z'lssrc could not retrieve service data (r   r9   r^   	Subsystemr{   activer   inoperativer   rz   srcr    )platformsystemr   rp   r"   r'   r?   rd   )
r   r-   
lssrc_pathr.   r/   r0   rA   rj   r3   r4   s
             r   rq   zAIXScanService.gather_servicesI  s   ??%11':J%)[[%<%<Wz=Q%R"FF7KK$$Y[]c%de   !'T 2 q$(JJL	y>A-$$Q<;6$'0|$R=H4,5M&r]m;,5M,5M:FQ^jo1p.q r   N)r   r   r   rq   r   r   r   r   r   G  s    r   r   c                      e Zd Zd Zd Zd Zy)OpenBSDScanServicec                   g }| j                   j                  | j                  d|      \  }}}d|j                         v r| j                   j	                  d       |S |j                  d      D ]  }|dk(  r	|j                  |        |S )Nz ls needs root privilegesrcctl requires root privilegesr9   r8   )r   r"   
rcctl_pathrT   r'   r?   append)r   cmdsvcsr.   r/   r0   svcs          r   query_rcctlzOpenBSDScanService.query_rcctlf  s    ![[444??TW5XYFF"flln4KK=>  ||D) %"9KK$	%
 r   c                d   i }| j                   j                  | j                  d|      \  }}}d|j                         v r| j                   j	                  d       |S d|z  }|j                  d      D ]7  }|dk(  sd|vr|j                  |dd      j                  dd      \  }}	|	||<   9 |S )	Nz get r   r   z%s_r9   r8   =r_   )r   r"   r   rT   r'   r?   r>   )
r   r   infor.   r/   r0   undyvariablekvs
             r   get_infozOpenBSDScanService.get_infos  s    ![[44DOOUY5Z[FF"flln4KK=>  4<D"LL.  r>S%8#++D"a8>>sAFDAqDG  r   c                    i }| j                   j                  d      | _        | j                  rN| j                  d      D ].  }|ddd||<   ||   j	                  | j                  |             0 | j                  d      D ]  }||   j	                  ddi        | j                  d      D ]  }||   j	                  d	d
i        | j                  d      D ]  }||   j	                  d	di        |j                         D ]W  }||   j                  d      ||   j	                  ddi       ||   j                  d	      B||   j	                  d	di       Y | j                  d      D ]
  }d||   d<    |S )NrcctlallF)r   r!   roguerL   rR   rM   startedr   r   ru   rJ   r   r   T)r   rp   r   r   updater   keysget)r   r-   r   s      r   rq   z"OpenBSDScanService.gather_services  s   ++227;?? ''. 9),% P$$T]]3%789 ''- <$$h	%:;< ''	2 ;$$gy%9:; ''1 :$$gx%89:  }} ?C=$$X.6SM(((J)?@ C=$$W-5SM(('9)=>? ''0 .)-g&. r   N)r   r   r   r   r   rq   r   r   r   r   r   d  s    !r   r   c                    t        t               d      } t        |       }t        ||      | _        t        t
        t        t        f}i }|D ].  } ||       }|j                         }|s|j                  |       0 t        |      dk(  rt        dd      }nt        t        |            } | j                  d	i | y )
NT)argument_specsupports_check_mode)LANGLC_ALLr   z]Failed to find any services. This can be due to privileges or some other configuration issue.)skippedr   )r-   )ansible_factsr   )r   dictr   run_command_environ_updater   rs   r   r   rq   r   rd   	exit_json)r   localeservice_modulesall_services
svc_modulesvcmodr   resultss           r   mainr     s    TJF%f-F(,&(HF%)+?QcdOL% %
F#$$&$	%
 <At  *I  JT<%@AFwr   __main__)
__future__r   DOCUMENTATIONEXAMPLESRETURNr$   r   r(   ansible.module_utils.basicr   "ansible.module_utils.common.localer   ansible.module_utils.servicer   objectr   r   rs   r   r   r   r   r   r   r   <module>r      s    #@,'
T 
  	 4 G ;& F FRD; DN[ :? ?D $ zF r   