a ì)gdÿã@sxddlmZmZmZeZdZdZdZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZe  ¡dkrŒddlmZddlmZmZdd lmZdd lmZdd lmZdd lm Z dd l!m"Z"m#Z#Gdd„de$ƒZ%Gdd„de%ƒZ&Gdd„de%ƒZ'Gdd„de'ƒZ(Gdd„de%ƒZ)Gdd„de%ƒZ*Gdd„de%ƒZ+Gdd„de%ƒZ,dd„Z-e.d krte-ƒdS)!é)Úabsolute_importÚdivisionÚprint_functionaI --- module: service version_added: "0.1" short_description: Manage services description: - Controls services on remote hosts. Supported init systems include BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart. - This module acts as a proxy to the underlying service manager module. While all arguments will be passed to the underlying module, not all modules support the same arguments. This documentation only covers the minimum intersection of module arguments that all service manager modules support. - This module is a proxy for multiple more specific service manager modules (such as M(ansible.builtin.systemd) and M(ansible.builtin.sysvinit)). This allows management of a heterogeneous environment of machines without creating a specific task for each service manager. The module to be executed is determined by the I(use) option, which defaults to the service manager discovered by M(ansible.builtin.setup). If C(setup) was not yet run, this module may run it. - For Windows targets, use the M(ansible.windows.win_service) module instead. options: name: description: - Name of the service. type: str required: true state: description: - C(started)/C(stopped) are idempotent actions that will not run commands unless necessary. - C(restarted) will always bounce the service. - C(reloaded) will always reload. - B(At least one of state and enabled are required.) - Note that reloaded will start the service if it is not already started, even if your chosen init system wouldn't normally. type: str choices: [ reloaded, restarted, started, stopped ] sleep: description: - If the service is being C(restarted) then sleep this many seconds between the stop and start command. - This helps to work around badly-behaving init scripts that exit immediately after signaling a process to stop. - Not all service managers support sleep, i.e when using systemd this setting will be ignored. type: int version_added: "1.3" pattern: description: - If the service does not respond to the status command, name a substring to look for as would be found in the output of the I(ps) command as a stand-in for a status result. - If the string is found, the service will be assumed to be started. - While using remote hosts with systemd this setting will be ignored. type: str version_added: "0.7" enabled: description: - Whether the service should start on boot. - B(At least one of state and enabled are required.) type: bool runlevel: description: - For OpenRC init scripts (e.g. Gentoo) only. - The runlevel that this service belongs to. - While using remote hosts with systemd this setting will be ignored. type: str default: default arguments: description: - Additional arguments provided on the command line. - While using remote hosts with systemd this setting will be ignored. type: str aliases: [ args ] use: description: - The service module actually uses system specific modules, normally through auto detection, this setting can force a specific module. - Normally it uses the value of the 'ansible_service_mgr' fact and falls back to the old 'service' module when none matching is found. type: str default: auto version_added: 2.2 extends_documentation_fragment: - action_common_attributes - action_common_attributes.flow attributes: action: support: full async: support: full bypass_host_loop: support: none check_mode: details: support depends on the underlying plugin invoked support: N/A diff_mode: details: support depends on the underlying plugin invoked support: N/A platform: details: The support depends on the availability for the specific plugin for each platform and if fact gathering is able to detect it platforms: all notes: - For AIX, group subsystem names can be used. seealso: - module: ansible.windows.win_service author: - Ansible Core Team - Michael DeHaan a9 - name: Start service httpd, if not started ansible.builtin.service: name: httpd state: started - name: Stop service httpd, if started ansible.builtin.service: name: httpd state: stopped - name: Restart service httpd, in all cases ansible.builtin.service: name: httpd state: restarted - name: Reload service httpd, in all cases ansible.builtin.service: name: httpd state: reloaded - name: Enable service httpd, and not touch the state ansible.builtin.service: name: httpd enabled: yes - name: Start service foo, based on running process /usr/bin/foo ansible.builtin.service: name: foo pattern: /usr/bin/foo state: started - name: Restart network service for interface eth0 ansible.builtin.service: name: network state: restarted args: eth0 ú#NÚSunOS)Ú LooseVersion)Úto_bytesÚto_text)Ú AnsibleModule)Úget_best_parsable_locale)Úget_platform_subclass)Úfail_if_missing)ÚPY2ÚbcszeZdZdZdZdZ‡fdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z ddd„Z dd„Z dd„Zdd„Zdd„Z‡ZS)ÚServiceaT This is the generic Service manipulation class that is subclassed based on platform. A subclass should override the following action methods:- - get_service_tools - service_enable - get_service_status - service_control All subclasses MUST define platform and distribution (which may be None). ÚGenericNcsttƒ}t||ƒ |¡S)N)r rÚsuperÚ__new__)ÚclsÚargsÚkwargsZnew_cls©Ú __class__©ú;/usr/lib/python3.9/site-packages/ansible/modules/service.pyrÇszService.__new__cCsª||_|jd|_|jd|_|jd|_|jd|_|jd|_|jd|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_|j dd ¡|_d|_d|_d|_d|_dS) NÚnameÚstateÚsleepÚpatternÚenabledÚrunlevelFÚ argumentsÚ)ÚmoduleÚparamsrrrrÚenabler ÚchangedÚrunningÚcrashedÚactionÚsvc_cmdÚsvc_initscriptÚ svc_initctlÚ enable_cmdÚgetr!Ú rcconf_fileÚ rcconf_keyÚ rcconf_valueÚ svc_change)Úselfr#rrrÚ__init__Ës(      zService.__init__cCs|jjdddS)Nz4get_service_tools not implemented on target platform©Úmsg©r#Ú fail_json©r3rrrÚget_service_toolsäszService.get_service_toolscCs|jjdddS)Nz1service_enable not implemented on target platformr5r7r9rrrÚservice_enableçszService.service_enablecCs|jjdddS)Nz5get_service_status not implemented on target platformr5r7r9rrrÚget_service_statusêszService.get_service_statuscCs|jjdddS)Nz2service_control not implemented on target platformr5r7r9rrrÚservice_controlíszService.service_controlFc st|jƒ}t|||d}|s,|jj||dSt ¡‰t ¡}|dkrxt ˆd¡t tj tj ¡}|dkrxt  |d¡|dkrŒt  |d¡|dkr t  |d¡|dvr²t |¡t ¡}|dkrÌt  d¡t  ¡t d¡t ¡}|dkrøt  d¡trt|dd }t |¡}n t|dd }d d „t |¡Dƒ}tj|d tjtj|‡fd d„d}tdƒ}tdƒ} |j|jg} | r$t | g| d¡\} } } | | | s°| ¡dur°q$|j| vrèt |j ¡d¡}|sà|  |j¡||7}|j| vrtt |j ¡d¡}|s|  |j¡| |7} qt| ¡t  !|j"t|ƒt| ƒg¡}t #ˆdt|dd ¡t ˆd¡t  d¡n¢|dkr’|jj$ddnˆt ˆd¡t %|d¡tdƒ}t ˆdggˆdg¡\} } } ˆd| vr´t ˆdd¡}|süq||7}q´t  &t|dd ¡SdS)N)ÚLANGÚLC_ALLÚ LC_MESSAGES)Zenviron_updateréé)rrArBú/Úsurrogate_or_strict©ÚerrorscSsg|]}t|dd‘qS)rDrE)r)Ú.0ÚcrrrÚ #óz+Service.execute_command..Fcst ˆd¡S)NrA)ÚosÚcloser©ÚpiperrÚ(rJz)Service.execute_command..)ÚshellÚstdoutÚstderrÚenvZ preexec_fnr"iéÿÿÿÿzunable to forkr5)'r r#ÚdictÚ run_commandrKrNÚforkrLÚopenÚdevnullÚO_RDWRÚdup2Ú_exitÚsetsidÚchdirrrÚshlexÚsplitr Ú subprocessÚPopenÚPIPErrQrRÚselectZpollÚreadÚfilenoÚremoveÚwaitÚjsonÚdumpsÚ returncodeÚwriter8ÚwaitpidÚloads)r3ÚcmdÚ daemonizeÚlocaleZlang_envÚpidÚfdÚprQrRZfdsZrfdZwfdZefdZdatZblobÚdatarrMrÚexecute_commandós‚            "           zService.execute_commandcCs~t ¡dkrd}nd}|j dd¡}| d||f¡\}}}|dkrzd|_| d ¡}|D] }|j|vrXd |vrXd|_qzqXdS) Nrz-efZauxwwZpsTú%s %srFÚ zpattern=)ÚplatformÚsystemr#Ú get_bin_pathrvr'r`r)r3ZpsflagsZpsbinÚrcZpsoutZpserrÚlinesÚlinerrrÚcheck_psQs  zService.check_pscCs€|jr|jdur|jjdd|js6|jdvr6d|_n(|jrN|jdvrNd|_n|jdkr^d|_|jjr||jr||jjddddS) Nz@failed determining service state, possible typo of service name?r5)ÚreloadedÚstartedT)r€ÚstoppedÚ restartedzservice state changed©r&r6)rr'r#r8r2Ú check_modeÚ exit_jsonr9rrrÚcheck_service_changedfs zService.check_service_changedcCsž|jr„|jdvrd|_nL|js0|jdkr0d|_n4|jdkrBd|_n"|jdkrTd|_n|jdkrdd|_|jjr||jjd d d | ¡Sd }d }d }|||fSdS)N)rÚstartr€r‚ÚstopÚreloadrƒÚrestartTzchanging service stater„rr")r2rr)r'r#r…r†r=)r3r|ÚerrÚoutrrrÚmodify_service_statess$    zService.modify_service_statec Cs¤|jdus|jdus|jdur,|jjddd|_d|j|jf}t|jdƒ˜}g}|D]~}tj|dd}t |ƒdkrÄd|d vrÄ|d  dd¡\}}||jkrÄ|  ¡|jkrºd |_qØn |}d|_|  |  ¡d ¡qXWdƒn1sì0Y|jdur|  |¡d|_|jdur |jj r8|jjdd d tj |j¡}tj |j¡} tj|d| d\} } |D]}t | | ¡¡qnt | ¡|j | |j¡dS)NzIservice_enable_rcconf() requires rcconf_file, rcconf_key and rcconf_valuer5z%s="%s" ÚrT©ZcommentsrAú=rFrxúchanging service enablementr„z%s-)ÚdirÚprefix)r/r0r1r#r8r&rXr_r`ÚlenÚupperÚappendÚstripr…r†rKÚpathÚdirnameÚbasenameÚtempfileZmkstemprlÚencoderLZ atomic_move) r3ÚentryZRCFILEZ new_rc_confZrclineZrcarrayÚkeyÚvalueZ rcconf_dirZ rcconf_baseZ TMP_RCCONFZtmp_rcconf_filerrrÚservice_enable_rcconfs< 2     zService.service_enable_rcconf)F)Ú__name__Ú __module__Ú __qualname__Ú__doc__ryÚ distributionrr4r:r;r<r=rvrr‡rŽr¡Ú __classcell__rrrrr¶s   ^ rc@sPeZdZdZdZdZdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dS)Ú LinuxServicezÚ This is the Linux Service manipulation class - it is currently supporting a mixture of binaries and init scripts for controlling services started at boot, as well as for controlling the current state. ZLinuxNc s>gd¢}gd¢}dg}tƒ‰|D]}|jj||dˆ|<q |D]$}d||jf}tj |¡r>||_q>‡fdd„}|ƒr–|j|_ˆd|_ ˆd|_ n&ˆ  d d ¡rBtj  d |j¡rBˆd |_ t d ƒ|_zTt d ¡}|j dˆd ¡\} } } | dkr| | ¡} | rt |  ¡dƒ|_Wnty4Yn0ˆd |_ nzˆ  dd ¡rhˆd|_ ˆd|_ dS|jr¼ˆ  dd ¡rŠˆd|_ n2ˆ  dd¡r¤ˆd|_ nˆ  dd ¡r¼ˆd|_ |j durÜt|jd |jdd|j durˆ  dd ¡rˆd|_ |j dur"|js"|jjddˆ  d d ¡r:ˆd |_dS)N)z/sbinz /usr/sbinz/binz/usr/bin) ÚserviceÚ chkconfigú update-rc.dú rc-serviceú rc-updateÚinitctlÚ systemctlrˆr‰r‹Úinsservz /etc/init.d)Zopt_dirsú%s/%scshˆ dd¡rddD]}tj |¡rdSqztddƒ}WntyJYdS0|D]}d|vrPdSqPdS)Nr¯F)z/run/systemd/system/z/dev/.run/systemd/z/dev/.systemd/Tz /proc/1/commrZsystemd)r.rKr™ÚexistsrXÚIOError)ZcanaryÚfr~©ÚlocationrrÚ check_systemdßs   z5LinuxService.get_service_tools..check_systemdr¯r®Fz/etc/init/%s.confz0.0.0z\(upstart (.*)\)z %s versionrr¬r­r«r°rªÚhostr5r©zbcannot find 'service' binary or init script for service, possible typo in service name?, aborting)rUr#r{rrKr™Úisfiler+Ú_LinuxService__systemd_unitr*r-r.r²rÚupstart_versionÚreÚcompilerVÚsearchÚgroupsÚ Exceptionr r8r,) r3ÚpathsZbinariesÚ initpathsZbinaryÚinitdirÚ initscriptr·Z version_rer|rQrRÚresrrµrr:Ðs^   "             zLinuxService.get_service_toolscCsbdd„}dd„}|j}| d|j|f¡\}}}|dkr.sysv_existscSstt d|¡ƒS)Nú/etc/rc?.d/S??)ÚboolÚglob)rrrrÚsysv_is_enabled4szALinuxService.get_systemd_service_enabled..sysv_is_enabledz%s is-enabled %srTZdisabledF)rºrvr-Ú startswith)r3rÈrÌÚ service_namer|rrŒrrrÚget_systemd_service_enabled/s z(LinuxService.get_systemd_service_enabledc Cs| d|j|jf¡\}}}|dkr@|jjd||j|fdn d|vr`|jjd|j|fdd}g}i}| ¡D]ž}d|vr|sÚ| dd¡\}}| ¡ d ¡rÌ|  ¡  d ¡rÀ|||<d}qØ|  |¡n |||<d}n,|  ¡  d ¡rüd   |¡||<d}n |  |¡qt|  |¡qt|S) Nz %s show '%s'rz,failure %d running systemctl show for %r: %sr5zLoadState=not-foundz5systemd could not find the requested service "%r": %sr‘rAú{ú}rx) rvr-rºr#r8Ú splitlinesr`ÚlstriprÍÚrstripÚendswithr—Újoin) r3r|rrŒrŸZ value_bufferZ status_dictr~r rrrÚget_systemd_status_dictBs2     z$LinuxService.get_systemd_status_dictcCsx| ¡}| d¡dkr$d|_d|_nN| d¡dkr@d|_d|_n2| d¡durf|jjd|jfdn d|_d|_|jS)NZ ActiveStateÚactiveTFZfailedz4No ActiveState value in systemctl show output for %rr5)r×r.r'r(r#r8rº)r3ÚdrrrÚget_systemd_service_statusjsz'LinuxService.get_systemd_service_statusc Csæ|jr|j d¡r| ¡Sd|_| ¡\}}}|jr||jdur|| d|j|j|j f¡\}}}d|vrnd|_nd|vr|d|_|jrÈ|j d¡rÈ|jdurÈ| d |j|jf¡\}}} d |v|_d | v|_ |jdurà|d vràd|_|jdurœ|  d ¡dkrœ|  ¡  |j  ¡d¡} d| vr$d|_nxd| vr:d| v|_nbd| vrVd| vrVd|_nFd| vrhd|_n4d| vrzd|_n"d| vrŒd|_nd| vrœd|_|jdur¸|dkr¸d|_|jdurà|jdkràd|vràd|_|jS)Nr¯Ústatusz%s status %s %sz stop/waitingFz start/runningTr¬z %s %s statusrr()rArBéééErxrAr"r‰Úrunznot rˆzcould not access pid filezis dead and pid file existszdead but subsys lockedzdead but pid file existsrZiptablesZACCEPT)r*rÕrÚr)r=r,r'rvrr!r(ÚcountÚlowerÚreplace) r3r|Z status_stdoutZ status_stderrZ initctl_rcZinitctl_status_stdoutZinitctl_status_stderrZ openrc_rcZopenrc_status_stdoutZopenrc_status_stderrZcleanoutrrrr<|sL           zLinuxService.get_service_statuscCsP|jdur|jjd|jdd|_d}|j d¡rìdd„}d}|jtdƒkrjt  d tj tj B¡}d }nt  d tj tj B¡}d }d ||jf}d||jf}t |ƒ}|  ¡} Wdƒn1sÄ0Y| | ¡ræ|jjddd|_tj |¡r€t |ƒ} |   ¡} Wdƒn1s"0Y|jrT| | ¡rTd|_| d| ¡} n*|js”| | ¡s”d|_d | |f¡} nn|js”d|_|} n|jjr®|jj|jd|jrèz||| ƒWn"tyæ|jjddYn0dS|j d¡r°|jrd}nd}| d|j|jf¡\} }}d|j|vrj| d|j|jf¡| d|j|jf¡\} }}|j|vrŠ|jjd|jdd||vr°d||vr°d|_dS|j d¡rî|jrÌd}nd }| ¡}|j|krîd|_dS|j d!¡r¼|jr d"}nd#}| d$|j¡\} }}| ¡D]t}| d%¡\}}| ¡}||jkrVq,t d&|¡}|jr~|j|vr~d|_n|js˜|j|vr˜d|_q°q,|js°d|_|js¼dS|j d'¡rôd}t d(|j¡}|rèd}|j|krêd|_|jr€d}t d)|j¡}|s„|jjs„| d*|j|jf¡\} }}| d+kr„|rb|jj|dn|jj|d|j|j|fnd }|jjsð| d,|j|j|f¡\} }}| d+krð|rÌ|jj|dn|jj|d|j|j|fnd|_dS|j d-¡rt|jr(| d.|j|jf¡\} }}n| d/|j|jf¡\} }}d|_| ¡D]N}|jrz| d0¡d1krzd|_q¢|jsR| d2¡d1krRd|_q¢qR|jjr¼|jj|jd|jsÈdS|jr"| d3|j|jf¡\} }}| d+ks|dkr|jjd4| ||fd| ||fS| d5|j|jf¡\} }}| d+ksR|dkrj|jjd6| ||fd| ||fSd|_|j d!¡r¢|j||jd7|jf}n,|j d¡rÀ|j||j f}n|j|j|f}|jjrè|jj|jd| d,|¡\} }}| d+krF|r*|jjd8||j| |fdn|jjd9||j| |fd| ||fS):NzScannot detect command to enable service %s, typo or init system potentially unknownr5Tr®cSs t|dƒ}| |¡| ¡dS)NÚw)rXrlrL)Ú file_nameZ file_contentsZ override_filerrrÚwrite_to_override_fileÆs  z;LinuxService.service_enable..write_to_override_filez /etc/initz0.6.7z ^manual\s*$zmanual z^start on manual\s*$zstart on manual z %s/%s.confz%s/%s.overridez+manual stanza not supported in a .conf fileFr"rx)r&zCould not modify override filerªZonZoffz %s --list %szchkconfig --add %sz %s --add %sz%service %s does not support chkconfigz3:%sz5:%sr¯r%Údisabler­ÚaddÚdeletez%s showú|z\s+r«rÉz/etc/rc?.d/K??z%s %s defaultsrú%s %s %sr°z %s -n -v %sz%s -n -r -v %szenable servicerTzremove servicerwz3Failed to install service. rc: %s, out: %s, err: %sz%s -r %sz2Failed to remove service. rc: %s, out: %s, err: %sú z$Error when trying to %s %s: rc=%s %szFailure for %s %s: rc=%s %s)!r-r#r8rr&rÕr»rr¼r½ÚMÚIrXrer¾rKr™r²r%ÚsubrÖr…r†rÀrvrÏrÒr`r˜r rËÚfindrº)r3r)råZinitpathZmanregZ config_lineZconf_file_nameZoverride_file_nameZ conf_file_fhZconf_file_contentZ override_fhZoverride_file_contentsZoverride_stater|rrŒZservice_enabledr~rÎZ runlevelsrZslinksZklinksrrrrr;ºs$  &  (                   zLinuxService.service_enablec Cs4d}|j}|jrf|j d¡sP|j d¡r>|j}d|j|f}qdd|j|jf}q€|j}d|j|f}n|jdur€|jr€d|j}|jr´|j d¡r´|jdkr´|jr´|jd|d d |jd kr|dkrê|jd ||j|fd d \}}}n"|jd |j|j|fd d \}}}n|jrH|j d¡rH|jd ||j|fd d \}}}nâ|dkrr|jd |d |fd d \}}}n |jd d |j|fd d \}}}|j r¦t   |j ¡|dkrÐ|jd |d|fd d \} } } n |jd d|j|fd d \} } } |dkr| dkr| }| }| }n|| }|| }|| }|||fS)Nr"r¯r®rwú%sr¬rˆz%s zapT©rpr‹rêr‰r) r!r*rÕrrºr+r)r(rvrÚtime) r3r*r!Zrc_staterQrRZrc1Zstdout1Zstderr1Zrc2Zstdout2Zstderr2rrrr=­sH   " "&"       zLinuxService.service_control) r¢r£r¤r¥ryr¦r:rÏr×rÚr<r;r=rrrrr¨Æs_(>tr¨c@s8eZdZdZdZdZdd„Zdd„Zdd „Zd d „Z dS) ÚFreeBsdServicezÛ This is the FreeBSD Service manipulation class - it uses the /etc/rc.conf file for controlling services started at boot and the 'service' binary to check status and perform direct service manipulation. ZFreeBSDNcCs6|j dd¡|_|js$|jjdd|j d¡|_dS)Nr©Tzunable to find service binaryr5Zsysrc)r#r{r*r8Ú sysrc_cmdr9rrrr:üsz FreeBsdService.get_service_toolscCsZ| d|j|jd|jf¡\}}}|jdkr8d|v|_n|dkrHd|_n|dkrVd|_dS) Nú %s %s %s %sÚ onestatusZpfZEnabledrAFrT)rvr*rr!r'©r3r|rQrRrrrr<s"  z!FreeBsdService.get_service_statuscCsø|jrd|_nd|_gd¢}|D]}tj |¡r ||_q | d|j|jd|j f¡\}}}zt j |dd}Wnt y~Yn0|s–|j jd||d |D]"}d |vrš|  d d ¡\|_}q¾qš|jdurÚ|j jd||d |jrÆ| d |j|jf¡\}} }|d kr |} |  ¡ ¡|jkr¾d|_|j jr@|j jddd| d|j|j|jf¡\}} } |d kr||j jd| | d | d|j|jdf¡\}} } |j|d kkrÄ|j jd| | d nd|_n.z | ¡WSt yò|j jddYn0dS)NÚYESÚNO)ú /etc/rc.confz/etc/rc.conf.localz/usr/local/etc/rc.confrõÚrcvarTrzunable to determine rcvar)r6rQrRr‘rAz%s -n %srr’r„z %s %s="%s"zunable to set rcvar using sysrcrêrz/unable to set rcvar: sysrc did not change valueFzunable to set rcvarr5)r%r1rKr™r¹r/rvr*rr!r_r`rÀr#r8r0rôr˜r–r&r…r†r¡)r3ÚrcfilesÚrcfiler|rQrRZrcvarsrûZdefault_rcconf_valueZcurrent_rcconf_valueZ change_stdoutZ change_stderrZ check_stdoutZ check_stderrrrrr; sN "       zFreeBsdService.service_enablecCsd|jdkrd|_|jdkr d|_|jdkr0d|_| d|j|j|j|jf¡}|jr`t |j¡|S)NrˆÚonestartr‰ÚonestoprŠZ onereloadrõ)r)rvr*rr!rrò)r3Úretrrrr=Ps    zFreeBsdService.service_control) r¢r£r¤r¥ryr¦r:r<r;r=rrrrróòs Cróc@s eZdZdZdZdZdd„ZdS)ÚDragonFlyBsdServicezá This is the DragonFly BSD Service manipulation class - it uses the /etc/rc.conf file for controlling services started at boot and the 'service' binary to check status and perform direct service manipulation. Z DragonFlyNcCsR|jrd|_nd|_dg}|D]}tj |¡r||_qd|j dd¡|_|  ¡S©Nrørùrúrðú-Ú_© r%r1rKr™r¹r/rrâr0r¡©r3rürýrrrr;ks z"DragonFlyBsdService.service_enable)r¢r£r¤r¥ryr¦r;rrrrrasrcs@eZdZdZdZdZdd„Zdd„Zdd „Z‡fd d „Z ‡Z S) ÚOpenBsdServicez· This is the OpenBSD Service manipulation class - it uses rcctl(8) or /etc/rc.d scripts for service control. Enabling a service is only supported if rcctl is present. ZOpenBSDNcCsZ|j d¡|_|jr|j|_n$d}d||jf}tj |¡rB||_|jsV|jjdddS)NZrcctlú /etc/rc.dr±zunable to find svc_cmdr5) r#r{r-r*rrKr™r¹r8)r3ZrcdirZ rc_scriptrrrr:…s  z OpenBsdService.get_service_toolscCst|jr&| d|jd|jf¡\}}}n| d|jdf¡\}}}|rR|jj|d|dkrbd|_n|dkrpd|_dS) NrêÚcheckrwr5rAFrT)r-rvr*rr#r8r'r÷rrrr<”s z!OpenBsdService.get_service_statuscCs>|jr$|jd|j|j|jfddS| d|j|jf¡SdS)Nz %s -f %s %sTrñz%s -f %s)r-rvr*r)rr9rrrr=¢szOpenBsdService.service_controlc sr|jstt|ƒ ¡S| d|jd|jdf¡\}}}|rF|jj|d| ¡}|dks^|dkrdd}n|}| d|jd|jdf¡\}}}|rš|jj|d| ¡}|dks²|dkr¸d}n|}|j rÔ|j |krÔ|j }n|j sè||krèd }nd}| d|jd|jd f¡\}}}|j r^|d kr(|s(dS|d kr>d |j} nd} |rXd |j|f} nd} n|dkrldSd|j} d} | s”| s”|jjdd|jj r®|jj dddd } | r| d|j| f¡\}}}|d kr|rò|jj|dn|jjddd} | rh| d|j| f¡\}}}|d krh|rJ| rDd|} n|} n| rVd} nd} |jj| dd|_ dS)NrõZgetdefÚflagsr5rørùr"r.rërÛrzset %s status onzset %s flags %srAzset %s status offzFneither status_action or status_flags is set, this should never happenTr’r„rwz%rcctl failed to modify service statusz7rcctl modified service status but failed to set flags: z5rcctl modified service status but failed to set flagsz$rcctl failed to modify service flags)r-rrr;rvrr#r8rÔr!r%r…r†r&) r3r|rQrRZ getdef_stringZ default_flagsZ get_stringZ current_flagsZ changed_flagsZ status_actionZ flags_actionZstatus_modifiedZ error_messagerrrr;¨sv            zOpenBsdService.service_enable) r¢r£r¤r¥ryr¦r:r<r=r;r§rrrrr{src@s8eZdZdZdZdZdd„Zdd„Zdd „Zd d „Z dS) Ú NetBsdServicea> This is the NetBSD Service manipulation class - it uses the /etc/rc.conf file for controlling services started at boot, check status and perform direct service manipulation. Init scripts in /etc/rc.d are used for controlling services (start/stop) as well as for controlling the current state. ZNetBSDNcCsHdg}|D]$}d||jf}tj |¡r ||_q |jsD|jjdddS)Nrr±zunable to find rc.d scriptr5)rrKr™r¹r+r#r8)r3rÂrÃrÄrrrr:s zNetBsdService.get_service_toolscCsR|jrd|_nd|_dg}|D]}tj |¡r||_qd|j dd¡|_|  ¡Srrrrrrr;'s zNetBsdService.service_enablecCsHd|j|_| d|jdf¡\}}}|dkr6d|_n|dkrDd|_dS)NrðrwrörAFrT)r+r*rvr'r÷rrrr<6s  z NetBsdService.get_service_statuscCsF|jdkrd|_|jdkr d|_d|j|_|jd|j|jfddS) Nrˆrþr‰rÿrðrwTrñ)r)r+r*rvr9rrrr=>s    zNetBsdService.service_control) r¢r£r¤r¥ryr¦r:r;r<r=rrrrr s r c@sHeZdZdZdZdZdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dS)Ú SunOSServicezù This is the SunOS Service manipulation class - it uses the svcadm command for controlling services, and svcs command for checking status. It also tries to be smart about taking the service out of maintenance state if necessary. rNcCsb|j dd¡|_|js$|jjdd|j dd¡|_|jsH|jjdd| ¡rXd|_nd|_dS) NZsvcsTzunable to find svcs binaryr5Zsvcadmzunable to find svcadm binaryú-sr")r#r{Úsvcs_cmdr8Ú svcadm_cmdÚsvcadm_supports_syncÚ svcadm_syncr9rrrr:RszSunOSService.get_service_toolscCs>tddƒ ¡D]*}t d| ¡¡}|r| ¡dkrdSqdS)Nz /etc/releaserz \s+Oracle Solaris (\d+)\.(\d+).*)Z11Ú2T)rXÚ readlinesr¼ÚmatchrÔr¿)r3r~Úmrrrrbsz!SunOSService.svcadm_supports_synccCs"| ¡}|dkrd|_nd|_dS)NÚonlineTF)Úget_sunos_svcs_statusr'©r3rÛrrrr<jszSunOSService.get_service_statuscCsl| d|j|jf¡\}}}|dkrF|r8|jj|dn|jj|d| d¡ d¡}|d d¡d}|S)NrwrAr5rxrTrër)rvrrr#r8rÔr`)r3r|rQrRr}rÛrrrrssz"SunOSService.get_sunos_svcs_statusc Cs | d|j|jf¡\}}}|dkrF|r8|jj|dn|jj|dd}d}| d¡D]&}| d¡rXd|vrrd}d |vrXd}qX|rŠ| p’| o’|}|jr¢|r¢dS|js°|s°dS|jjs|jrÆd }nd }| d |j ||jf¡\}}}|dkr|r|jj|dn|jj|dd|_ dS) Nz%s -l %srr5FrxrÚtrueTÚ temporaryz enable -rsz disable -srê) rvrrr#r8r`rÍr%r…rr&) r3r|rQrRrrr~Zstartup_enabledÚsubcmdrrrr;s8     zSunOSService.service_enablecCsì| ¡}|jdvrP|dvrP| d|j|jf¡\}}}|dkrH|||fS| ¡}|dvrj|jjd|d|jdkrzd}nZ|jd krŠd }nJ|jd kr d |j}n4|jd kr¾|dkr¾d|j}n|jd krÔ|dkrÔd}| d|j||jf¡S)N)rˆrŠr‹)Z maintenanceZdegradedz %s clear %srz)Failed to bring service out of %s status.r5rˆz enable -rstr‰z disable -strŠz refresh %sr‹rz restart %srê)rr)rvrrr#r8r)r3rÛr|rQrRrrrrr=³s&      zSunOSService.service_control) r¢r£r¤r¥ryr¦r:rr<rr;r=rrrrr Hs 2r c@s8eZdZdZdZdZdd„Zdd„Zdd„Zd d „Z dS) ÚAIXa This is the AIX Service (SRC) manipulation class - it uses lssrc, startsrc, stopsrc and refresh for service control. Enabling a service is currently not supported. Would require to add an entry in the /etc/inittab file (mkitab, chitab and rmitab commands) NcCs”|j dd¡|_|js$|jjdd|j dd¡|_|jsH|jjdd|j dd¡|_|jsl|jjdd|j d d¡|_|js|jjd ddS) NZlssrcTzunable to find lssrc binaryr5Zstartsrczunable to find startsrc binaryZstopsrczunable to find stopsrc binaryZrefreshzunable to find refresh binary)r#r{Ú lssrc_cmdr8Ú startsrc_cmdÚ stopsrc_cmdÚ refresh_cmdr9rrrr:ÙszAIX.get_service_toolscCs"| ¡}|dkrd|_nd|_dS)NrØTF)Úget_aix_src_statusr'rrrrr<îszAIX.get_service_statuscCsâ| d|j|jf¡\}}}|dkr¸| d|j|jf¡\}}}|dkrl|r\|jj|dq¶|jj|dqÞ| ¡}|dd…D],}| ¡d ¡dkr€| ¡d ¡}q²q€d}|Sn&| d¡ d¡}|d d¡d}|SdS) Nz%s -s %srAz%s -g %sr5rTrØrxrë) rvrrr#r8rÒr`r˜rÔ)r3r|rQrRr}rrÛrrrr!÷s"zAIX.get_aix_src_statusc Csv| d|j¡\}}}|dkrB|r2|jj|dqº|jj|dnx| ¡}g}g}|dd…D]<}| ¡d ¡}| ¡d ¡} | |¡| r^| | ¡q^|j|vr¬d} n|j|vrºd} |j dkrÌ|j } nb|j dkrÞ|j } nP|j d krð|j } n>|j d kr.| d |j | |jf¡|j r(t  |j ¡|j } |jr\|j d vr\| d | |j| |jf¡S| d | | |jf¡SdS)Nz%s -arAr5rr z-grˆr‰rŠr‹rê)rˆr‹z%s -a "%s" %s %s)rvrr#r8rÒr`r˜r—rr)rrr rròr!) r3r|rQrRr}Z subsystemsr¿r~Z subsystemÚgroupZsrccmd_parameterZsrccmdrrrr=s@         zAIX.service_control) r¢r£r¤r¥ryr¦r:r<r!r=rrrrrÎs  rc Cs"tttdddtdgd¢dtddtddtddtdd d tdd d gd ddddggd}t|ƒ}| d|j¡|jrŽ| d|j¡d}d }d }i}|j|d<| ¡|jj ddurÒ|  ¡|j |d<|j ddurú|j |d<|j fi|¤Ž|j|d<|jr| ¡n| ¡| ¡| ¡\}}}|dkrp|rPd|vrPn |rd|j|dn |j|d|j |jB|d<|jj ddur¢|jj d|d<|jj dsê| ¡}|durÌd|d<n|duràd|d<nd|d<n$|jj ddvrd|d<nd|d<|j fi|¤ŽdS)NÚstrT)ÚtypeÚrequired)rr‚r€rƒ)r$ÚchoicesÚint)r$rÊÚdefault)r$r(r"r)r$r(Úaliases)rrrrrr r!rr)Z argument_specZsupports_check_modeZrequired_one_ofz"Service instantiated - platform %sz&Service instantiated - distribution %srrr&zJob is already runningr5ZabsentFrr‚)r€rƒr)r rUrÚdebugryr¦rr:r#r$r;r%r&r†rrrr<r‡rŽr8r2)r#r©r|rrŒÚresultrÛrrrÚmainGsn  ù õ             r,Ú__main__)/Z __future__rrrr$Z __metaclass__Z DOCUMENTATIONZEXAMPLESZRETURNrËrirKryr¼rdr_rarœròrzZ#ansible.module_utils.compat.versionrZansible.module_utils._textrr Zansible.module_utils.basicr Z"ansible.module_utils.common.localer Z$ansible.module_utils.common.sys_infor Zansible.module_utils.servicer Zansible.module_utils.sixrrÚobjectrr¨rórrr r rr,r¢rrrrÚsRi'      0o8y[