a ì)gXRã@sªddlmZmZmZeZddlZddlZddlmZm Z ddl m Z m Z ddl mZmZddlmZmZddlmZddlmZeƒZGd d „d eƒZGd d „d eƒZdS) é)Úabsolute_importÚdivisionÚprint_functionN)ÚdatetimeÚ timedelta)Ú AnsibleErrorÚAnsibleConnectionFailure)Ú to_nativeÚto_text)Úcheck_type_listÚcheck_type_str)Ú ActionBase)ÚDisplayc@s eZdZdS)ÚTimedOutExceptionN)Ú__name__Ú __module__Ú __qualname__©rrúA/usr/lib/python3.9/site-packages/ansible/plugins/action/reboot.pyrsrc s eZdZdZedƒZdZdZdZdZ dZ dZ dZ d Z d Zd ZiZd d d d d dd dœZdddœZdddedddddddœ ZdddœZ‡fdd„Zedd„ƒZedd „ƒZd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Z d1d2„Z!d;d3d4„Z"d5d6„Z#dÚ ActionModuleF) Úboot_time_commandÚconnect_timeoutÚmsgÚpost_reboot_delayÚpre_reboot_delayÚreboot_commandÚreboot_timeoutÚ search_pathsÚ test_commandiXNrZwhoamiz#cat /proc/sys/kernel/random/boot_idzReboot initiated by AnsibleZshutdownz-r {delay_min} "{message}"Tz/sbin/sysctl kern.boottimezwho -bz/grep booted /var/log/vmksummary.log | tail -n 1)ÚfreebsdÚopenbsdÚmacosxÚsolarisÚsunosÚvmkernelÚaixÚreboot)Úalpiner$Úz-r +{delay_min} "{message}"z-r +{delay_sec}s "{message}"z"-y -g {delay_sec} -i 6 "{message}"z-d {delay_sec}z-Fr) r'ZvoidrZlinuxr!r r"r#r$r%Zwho)r"r$cstt|ƒj|i|¤ŽdS)N)ÚsuperrÚ__init__)ÚselfÚargsÚkwargs©Ú __class__rrr*VszActionModule.__init__cCs| d|j¡S)Nr)Ú _check_delayÚDEFAULT_PRE_REBOOT_DELAY©r+rrrrYszActionModule.pre_reboot_delaycCs| d|j¡S)Nr)r0ÚDEFAULT_POST_REBOOT_DELAYr2rrrr]szActionModule.post_reboot_delaycCs4t|jj ||jj |d|¡¡ƒ}|dkr0d}|S)z)Ensure that the value is positive or zeroZ_secr)ÚintÚ_taskr,Úget)r+ÚkeyÚdefaultÚvaluerrrr0as$zActionModule._check_delayc CsDt||ƒ}| |d|d| |d| |dt||ƒ¡¡¡}|S)zXGet dist+version specific args first, then distribution, then family, lastly use defaultÚnameÚversionÚfamily)Úgetattrr6)r+Z variable_nameÚ distributionZ default_valueÚattrr9rrrÚ_get_value_from_factshs þþþz"ActionModule._get_value_from_factsc CsÆ|jj d¡}|dur†zt|dd}Wn4tyZ}ztdt|ƒƒ‚WYd}~n d}~00z| dd¡dWSty‚YdS0n<|  d|d ¡}|j d }|jj d |j ¡}|j |j ||d SdS) NrF©Zallow_conversionú-Invalid value given for 'reboot_command': %s.ú ér(ÚSHUTDOWN_COMMAND_ARGSÚDEFAULT_SHUTDOWN_COMMAND_ARGSé<r)Z delay_secÚ delay_minÚmessage) r5r,r6r Ú TypeErrorrr ÚsplitÚ IndexErrorr@rÚDEFAULT_REBOOT_MESSAGEÚformat)r+r>rÚer,rHZreboot_messagerrrÚget_shutdown_command_argsts&   z&ActionModule.get_shutdown_command_argsc Cs i}t dj|jjd¡|j|dddid}zœ| dd¡rdtd  t|d ƒ  ¡t|d ƒ  ¡¡ƒ‚|d d   ¡|d<t |d d  d¡dƒ|d<t |d d  ¡ƒ|d<t dj|jj|d¡|WSt y}z td |jd¡ƒ‚WYd}~n d}~00dS)Nz2{action}: running setup module to get distribution©Úactionzansible.legacy.setupZ gather_subsetÚmin©Ú task_varsZ module_nameZ module_argsÚfailedFz1Failed to determine system distribution. {0}, {1}Z module_stdoutZ module_stderrZ ansible_factsZansible_distributionr:Zansible_distribution_versionÚ.rr;Zansible_os_familyr<z{action}: distribution: {dist})rRZdistz@Failed to get distribution information. Missing "{0}" in output.)ÚdisplayÚdebugrNr5rRÚ_execute_moduler6rr ÚstripÚlowerr rKÚKeyErrorr,)r+rUr>Z module_outputZkerrrÚget_distribution‰s(ý þzActionModule.get_distributionc Cs>|jj d¡}|durnzt|dd}Wn4tyZ}ztdt|ƒƒ‚WYd}~n d}~00| dd¡d}n| d|d ¡}|dd krŒ|Sgd ¢}|jj d |¡}z t |ƒ}Wn$tyÔd }t|  |¡ƒ‚Yn0t   dj |jj ||d¡|j|d||gddœd} dd„| dDƒ} | s2td  ||¡ƒ‚| dSdS)NrFrArBrCrDrÚSHUTDOWN_COMMANDSÚDEFAULT_SHUTDOWN_COMMANDú/)z/sbinz/binz /usr/sbinz/usr/binz/usr/local/sbinrz@'search_paths' must be a string or flat list of strings, got {0}zL{action}: running find module looking in {paths} to get path for "{command}")rRÚcommandÚpathszansible.legacy.findÚany)rcÚpatternsZ file_typerTcSsg|] }|d‘qS)Úpathr)Ú.0ÚxrrrÚ Æóz5ActionModule.get_shutdown_command..Úfilesz1Unable to find command "{0}" in search paths: {1})r5r,r6r rJrr rKr@r rNrXrYrRrZ) r+rUr>rrOZ shutdown_binZdefault_search_pathsrÚerr_msgZ find_resultÚ full_pathrrrÚget_shutdown_commandžsD&   ýýü z!ActionModule.get_shutdown_commandcCsD|j ¡D]4\}}|jj |¡dur t dj|||jjd¡q dS)NzGSince Ansible {version}, {arg} is no longer a valid option for {action})r;ÚargrR) ÚDEPRECATED_ARGSÚitemsr5r,r6rXÚwarningrNrR)r+ror;rrrÚdeprecated_argsËsýzActionModule.deprecated_argsc Cs| d|d¡}|jj d¡rp|jj d¡}zt|ddWn4tyn}ztdt|ƒƒ‚WYd}~n d}~00t  dj |jj |d¡|j ||j d }|d d krÚ|d }|d }tdj |jj |d t|ƒt|ƒdƒ‚t  dj |jj |d  ¡d¡|d  ¡S)NÚBOOT_TIME_COMMANDSÚDEFAULT_BOOT_TIME_COMMANDrFrAz0Invalid value given for 'boot_time_command': %s.z5{action}: getting boot time with command: '{command}'©rRrb©ZsudoableÚrcrÚstdoutÚstderrzS{action}: failed to get host boot time info, rc: {rc}, stdout: {out}, stderr: {err})rRrxÚoutÚerrz {action}: last boot time: {boot})rRZboot)r@r5r,r6r rJrr rXrYrNrRÚ_low_level_execute_commandÚDEFAULT_SUDOABLEr[)r+r>rrOÚcommand_resultryrzrrrÚget_system_boot_timeÓs(& ü z!ActionModule.get_system_boot_timec Csât dj|jjd¡|jj d|jj d|j¡¡}|rŠz4t dj|jj|d¡|j   d|¡|j   ¡Wnt yˆt  d¡Yn0z| |¡}Wn(tyÀ}z|‚WYd}~n d}~00t|ƒd ksÖ||krÞtd ƒ‚dS) Nz,{action}: attempting to get system boot timerQrZconnect_timeout_secz,{action}: setting connect_timeout to {value}©rRr9Úconnection_timeoutzHConnection plugin does not allow the connection timeout to be overriddenrzboot time has not changed)rXÚvvvrNr5rRr,r6ÚDEFAULT_CONNECT_TIMEOUTrYÚ _connectionÚ set_optionÚresetÚAttributeErrorrrr€Ú ExceptionÚlenÚ ValueError)r+r>Úprevious_boot_timerZcurrent_boot_timerOrrrÚcheck_boot_timeës zActionModule.check_boot_timec Ksà|jj d| d|d¡¡}t dj|jjd¡t dj|jj|d¡z|j ||j d}Wn6t y’z|j   ¡WntyŠYn0‚Yn0|d d krÆd jt|d ƒt|d ƒd}t|ƒ‚t dj|jjd¡dS)NrÚ TEST_COMMANDSÚDEFAULT_TEST_COMMANDz-{action}: attempting post-reboot test commandrQz9{action}: attempting post-reboot test command '{command}'rvrwrxrz Test command failed: {err} {out}rzry)r|r{z&{action}: system successfully rebooted)r5r,r6r@rXrƒrNrRrYr}r~r‰r…r‡rˆr Ú RuntimeError)r+r>r-rrrrrrÚrun_test_commands$     þzActionModule.run_test_commandc Csxt ¡t|d}|duri}d}d}t ¡|krbz4|fd|i|¤Ž|rdt dj|jj|d¡WdSty^} zÜt | t ƒr¦z|j   ¡Wnt y¤Yn0t  dd¡d} d|| } | |krÒ|| } |r8zt| ƒ ¡d } Wn.ty} zt| ƒ} WYd} ~ n d} ~ 00t d j|jj|| | d ¡|d 7}t | ¡WYd} ~ q&d} ~ 00q&td j||dƒ‚dS)N)Úsecondsré r>z{action}: {desc} success)rRÚdescièééÿÿÿÿz@{action}: {desc} fail '{err}', retrying in {sleep:.4} seconds...)rRr”r|ÚsleeprDz0Timed out waiting for {desc} (timeout={timeout}))r”Útimeout)rÚutcnowrrXrYrNr5rRr‰Ú isinstancerr…r‡ÚrandomZrandintr Ú splitlinesrLÚtimer—r) r+rRrÚ action_descr>Ú action_kwargsZ max_end_timeZ fail_countZmax_fail_sleeprOZ random_intZ fail_sleepÚerrorrrrÚdo_until_success_or_timeoutsF   ü"z(ActionModule.do_until_success_or_timeoutc Csi}i}| ||¡}| |¡}d ||¡}zBt dj|jjd¡t dj|jj|d¡|j||j d}WnHt y´}z0t dj|jjt |ƒd¡d |d <WYd}~n d}~00t   ¡|d <|d d krd |d <d|d<djt|d ¡ƒt|d ¡ƒd|d<|Sd|d <|S)Nz{0} {1}z{action}: rebooting server...rQz3{action}: rebooting server with command '{command}'rvrwz>{action}: AnsibleConnectionFailure caught and handled: {error}©rRr rrxÚstartTrVFÚrebootedz6Reboot command failed. Error was: '{stdout}, {stderr}'ryrz)ryrzr)rnrPrNrXrƒr5rRrYr}r~rr rr™r r[) r+rUr>ÚresultÚ reboot_resultZshutdown_commandZshutdown_command_argsrrOrrrÚperform_rebootCs.    þ zActionModule.perform_rebootc Cspt dj|jjd¡i}zt|jj d|jj d|j¡¡ƒ}|j |j d|||dz|j   d¡}Wnt yxYn„0||krüz4t dj|jj|d ¡|j  d|¡|j  ¡WnDttfyú}z(t d j|jjt|ƒd ¡WYd}~n d}~00|j |jd |||dd |d<d |d<WnFtyj}z,d |d<d |d<t|ƒ|d<|WYd}~Sd}~00|S)Nz{action}: validating rebootrQrZreboot_timeout_seczlast boot time check)rRržrr>rŸr‚zC{action}: setting connect_timeout back to original value of {value}rzE{action}: failed to reset connection_timeout back to default: {error}r¢zpost-reboot test commandTr¤ÚchangedrVr)rXrƒrNr5rRr4r,r6ÚDEFAULT_REBOOT_TIMEOUTr¡rr…Ú get_optionr]rYr†r‡rrˆr r‘r) r+r>Úoriginal_connection_timeoutrŸr¥rrrOZtoexrrrÚvalidate_reboot`sT"û þÿû  zActionModule.validate_rebootc sød|_d|_|jjdkr6d |jj¡}dddd|dœS|jjrJddddœS|durVi}|  ¡t t |ƒ  ||¡}|  dd¡sˆ|  d d¡rŒ|S| |¡}z| |¡}WnDtyè}z,d|d <d|d <t|ƒ|d <|WYd}~Sd}~00d}z(|j d ¡}t d j|jj|d¡Wn*ty@t dj|jjd¡Yn0| ||¡} | d rz| }t ¡| d} | j|d<|S|jdkrÆt dj|jj|jd¡t dj|jj|jd¡t |j¡|j||d|id}t ¡| d} | j|d<|S)NTÚlocalz@Running {0} with local connection would reboot the control node.Fr)r¨Úelapsedr¤rVr)r¨r®r¤ZskippedrVr&rr‚z6{action}: saving original connect_timeout of {timeout})rRr˜z<{action}: connect_timeout connection option has not been setrQr£r®z/{action}: waiting an additional {delay} seconds)rRZdelayrŒ)rŸ)Z_supports_check_modeZ_supports_asyncr…Z transportrNr5rRZ _play_contextZ check_modersr)rÚrunr6r^r€r‰r rªrXrYr]r§rr™r’rrƒrr—r¬) r+ÚtmprUrr¥r>rŒrOr«r¦r®r.rrr¯•sR           zActionModule.run)N)NN)NN)'rrrZTRANSFERS_FILESÚ frozensetZ _VALID_ARGSr©r„r1r3rrurMr`rFr~rprtr_rErŽr*Úpropertyrrr0r@rPr^rnrsr€rr‘r¡r§r¬r¯Ú __classcell__rrr.rrsp ù þöþ    - ) 5r)Z __future__rrrÚtypeZ __metaclass__r›rrrZansible.errorsrrZansible.module_utils._textr r Z&ansible.module_utils.common.validationr r Zansible.plugins.actionr Zansible.utils.displayrrXr‰rrrrrrÚs