
    Vh{                     ,   d dl mZmZmZ e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dZdZdZdZdZdZdZdZdZ dZ!dZ"d dl#Z#d d l$m$Z$ d d!l%m&Z& d dl'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/ dOd&Z0d' Z1d( Z2	 	 	 	 dPd)Z3	 	 	 	 	 dQd*Z4dRd+Z5dSd,Z6d- Z7dTd.Z8dUd/Z9d0edfd1Z:d2 Z;dTd3Z<dVd4Z=d5 Z>dWd6Z?dXd7Z@dYd8ZAdTd9ZBdZd:ZCd; ZDd< ZEd= ZFd[d>ZGd? ZHd@ ZIdA ZJd\dBZKd]dCZLd^dDZMdE ZN	 	 	 d_dFZOeefdGZPdH ZQdI ZRdJ ZSdK ZTdL ZUdM ZVdN ZWy)`    )absolute_importdivisionprint_functionzChanges found to be applied.zNo changes found to be applied.zRiDRAC reset is in progress. Until the iDRAC is reset, the changes would not apply.z"iDRAC has been reset successfully.zLUnable to reset the iDRAC. For changes to reflect, manually reset the iDRAC.zcUnable to complete the operation because the value `{0}` for the input  `{1}` parameter is invalid.z3Lifecycle controller status check is not supported.z]Lifecycle controller status check is {lc_status} after {retries} number of retries, Exiting..zSystem.Embedded.1ziDRAC.Embedded.1z/redfish/v1/Systemsz/redfish/v1/Managersz/redfish/v1/Chassisz3/redfish/v1/Managers/{res_id}/Actions/Manager.Resetz9/redfish/v1/Systems/{res_id}/Actions/ComputerSystem.Resetz?/redfish/v1/Managers/iDRAC.Embedded.1/Jobs?$expand=*($levels=1)z./redfish/v1/Managers/iDRAC.Embedded.1/Jobs/{0}zH/redfish/v1/Managers/iDRAC.Embedded.1/Oem/Dell/Jobs?$expand=*($levels=1)z7/redfish/v1/Managers/iDRAC.Embedded.1/Oem/Dell/Jobs/{0}z=/redfish/v1/Managers/iDRAC.Embedded.1?$select=FirmwareVersionzk^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$zApplicationService/Infoz	@odata.id   
   zH/redfish/v1/UpdateService/Oem/Dell/DellSoftwareInventory?$select=Membersz8/redfish/v1/UpdateService/Oem/Dell/DellSoftwareInventoryzJThe value for the 'job_wait_timeout' parameter cannot be negative or zero.z<Invalid value for time. Enter the value in positive integer.N)datetime)getfullargspec)	HTTPError)ConnectionErrorSSLValidationError)URLErrorr
   )IDRACFirmwareInfoc                     | j                         }|j                         }|s|j                         }|D ]7  }|r|}nt        |      j                         }||v s&| j	                  |d       9 | S )z
    :param odata_dict: the dict to be stripped of unwanted keys
    :param chkstr: the substring to be checked among the keys
    :param case_sensitive: should the match be case sensitive or not
    :return: dict
    N)copykeyslowerstrpop)
odata_dictchkstrcase_sensitivecpklistklks          q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/dellemc/openmanage/plugins/module_utils/utils.pystrip_substr_dictr   J   sl     
	BGGIE $BQBR<NN1d#$     c                 R   | d }}| j                  d      dk(  r| j                  d      \  }}t        j                  t        |      s`d|v r|j                  d      \  }}|j                  d      }t        |      }||dk(  rdj                  |      } | S dj                  ||      } | S )N:   z]:z[] z[{0}]z	[{0}]:{1})countsplitrematchHOSTNAME_REGEXstripcompress_ipv6format)hostnameip_addrports      r   config_ipv6r.   _   s    dTG~~ca s+88NG,7?#MM$/MGT--%(<42:~~g.H O #))'48HOr   c                    | j                  d      }g }|D ]J  }t        j                  dd|      }|j                         }dt	        |      k(  rd}|j                  |       L dj                  |      }t        j                  dd|d      }|S )Nr    z^0+r"   r   0z(:0)+r!   )r$   r%   subr   lenappendjoin)	ipv6_longgroupstempgrouptempstr
ipv6_shorts         r   r)   r)   o   s    __S!FD vr5)E
?EE hhtnG#w2Jr   c
                 h   ||z  }
||z  }d}d}i }d}t        |      t        |      z  r|d||fS d}t        j                  |	       ||
k  r|dz  }	 | j                  d|      }|j                  }|}|D ]  }|j                  |i       } ||v rd}d}|
}n
||v rd}d	}|
}|r||v r5t        j                  |       ||z   }nt        j                  |       ||z   }||
k  r||||fS # t        $ rA}|rt        j                  |       ||z   }nd}d
t        |      z   }Y d}~A|dz
  }Y d}~Qd}~ww xY w)a  
    :param rest_obj: the rest_obj either of the below
    ansible_collections.dellemc.openmanage.plugins.module_utils.ome.RestOME
    :param job_uri: the uri to fetch the job response dict
    :param max_job_wait_sec: max time the job will wait
    :param job_state_var: The nested dict traversal path
    :param job_complete_states:
    :param job_fail_states:
    :param job_running_states:
    :param sleep_interval_secs:
    :param max_unresponsive_wait:
    :param initial_wait:
    :return:
    r   TOverlapping job states found.Job tracking started.r!   GETFJob tracking completed.zJob is in Failed state.Exception in job tracking N)settimesleepinvoke_request	json_dataget	Exceptionr   )rest_objjob_urimax_job_wait_secjob_state_varjob_complete_statesjob_fail_statesjob_running_statessleep_interval_secsmax_unresponsive_waitinitial_waitmax_retriesunresploop_ctr
job_failedjob_dict	wait_timemsgjob_resp
job_statusxerrs                        r   job_trackingr]   }   s   0 #&99K"&99FHJHI
#o"66:HiOO
!CJJ|
[
 A	 ..ug>H))H!J" 3'^^Ar2
300"
/&.!
/&!!33JJ23 ),? ?I

./%(;;	- [
 @ sHi//  	 

./%(;;	!
2SX=aZF	 s   B	C' '	D10-D,"D,,D1c
                 v   ||z  }
||z  }d}d}i }d}t        |      t        |      z  r|d||fS d}t        j                  |	       ||
k  r|dz  }	 | j                  |d      }|j                  }|}|j                  |d      }||v rt        j                  |       ||z   }n?||v rd}d	}|
}n4||v rd}d
j                  |      }|
}nt        j                  |       ||z   }||
k  r||||fS # t        $ rA}|rt        j                  |       ||z   }nd}dt        |      z   }Y d }~A|dz
  }Y d }~Qd }~ww xY w)Nr   Tr<   r=   r!   r>   UnknownFr?   zJob is in {0} state.r@   )	rA   rB   rC   rD   rE   rF   r*   rG   r   )rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r\   s                       r   idrac_redfish_job_trackingr`      s    #&99K"&99FHJHI
#o"66:HiOO
!CJJ|
[
 A	 ..w>H))H!J#yAJ//

./%(;;	22"
/&.!
,33J?&

./%(;;	) [
 < sHi//  	 

./%(;;	!
2SX=aZF	 s   BC. .	D87-D3)D33D8c                     i }| j                  |      }|j                  |      rt        fd||   D              }|S )Nc              3   b   K   | ]&  }|j                        |j                        f ( y wNrF   ).0itemkeyvalues     r   	<genexpr>z!get_rest_items.<locals>.<genexpr>   s&     Ud$((3-%9Us   ,/)get_all_items_with_paginationrF   dict)rH   urirg   rh   selector	item_dictresps     ``   r   get_rest_itemsrp      s>    I11#6DxxUd8nUU	r   c                     | j                  d|      }g }|j                  rY|j                  j                  |      r>|j                  j                  |g       }|D ]  }|j                  |d      |k(  s||fc S  i |fS )Nr>   r"   )rD   successrE   rF   )rH   namerl   rg   rh   ro   tlistxtypes           r   get_item_and_listrv      s    ""5#.DE||**51""5"- 	$Eyyb!T)e|#	$ u9r   c                 ~    d}|D ]5  }| j                  |      }|||j                  |      k7  s,|||<   |dz   }7 |S )Nr   r!   rd   )srcdestr   diff_cntr   vs         r   apply_diff_keyr|   
  sP    H $GGAJ=Q$((1+-DG!|H	$
 Or   c                 p   |}|}|rs|r||kD  r||z
  }n|}d}t        j                  |       | j                  d|      }|j                  j	                  d      dk(  rt        j                  d       |dfS |rpn+| j                  d|      }t        j                  d       |dfS i dj                  |      fS )Nr   r>   PercentCompleted   r   r"   *The job is not complete after {0} seconds.)rB   rC   rD   rE   rF   r*   )redfish_objrl   job_waitwait_timeout
sleep_timemax_sleep_timesleep_intervalrY   s           r   wait_for_job_completionr     s    !NN.!/.!@!/!"JJ~&"11%=H!!%%&78C?

2|#  --eS9

2|;BB<PPPr   c                 0   t        j                  |dz         t        }|}d}|dkD  r<	 | j                  t        d       t        j                  |dz         t
        }d}	 ||fS ||fS # t        $ r t        j                  |       ||z
  }Y nw xY w|dkD  ro4)N   Tr   r>   F)rB   rC   RESET_UNTRACKrD   MANAGERS_URIRESET_SUCCESSrG   )idracwait_time_secintervalrX   waittrack_faileds         r   wait_after_idrac_resetr   *  s    JJx1}
CDL
(	#  u5JJx1}%C L <  	#JJx (?D	# (s   6A( (#BB,  c                     d}d}	 | j                  t        j                  |      dddi       |rt        | ||      \  }}d}|||fS # t        $ r d}t
        }Y w xY w)	NTz#iDRAC reset triggered successfully.res_idPOST	ResetTypeGracefulRestartdataF)rD   IDRAC_RESET_URIr*   r   rG   
RESET_FAIL)idrac_restobjr   r   r   r   	reset_msgresets          r   reset_idracr   =  s    L5I$$_%;%;6%;%JF+68I*J 	% 	L&<]M[c&d#L) ,	))  	s   >A	 	AAc                     	 | j                  t        d      }|j                  j                  d      }|d   j                  t              }|j                  d      d   }|S # t        $ r
 t        }Y |S w xY w)Nr>   Membersr   /)rD   r   rE   rF   ODATA_IDr$   r
   
MANAGER_ID)r   ro   membsres_urir   s        r   get_manager_res_idr   L  st    ##L%8""9-(,,x(s#B' M  Ms   AA! !A43A4c                     |}|}dj                  |      }|r|r||kD  r||z
  }n|}d}t        j                  |       | j                  |d      }|j                  j                  d      dk(  rt        j                  d       |dfS |j                  j                  d      d	k(  rt        j                  d       ||fS |rn+| j                  |d      }t        j                  d       |dfS i dj                  |      fS )
Nr   r   r>   r~   r   r   r"   JobStateRebootFailedr*   rB   rC   rD   rE   rF   )	r   rl   r   r   r   r   r   job_msgrY   s	            r   wait_for_idrac_job_completionr   W  s    !NN:AA,OG.!/.!@!/!"JJ~&++C7H!!%%&78C?

2|#!!%%j1^C

2((  ''U3

2|;BB<PPPr   c                    ddi }}}t         }		 | j                  t        j                  |      d|       t	        j
                  d       |r|| j                  t        |       d      }
t        t        d |
j                  d	               }|r<t        | t        |       j                  |d
   d         ||      \  }}d|v rd|}	}|sd}|||	|fS # t        $ r d}t        }	Y w xY w)NTFr   r   r   r   r>   c                     | d   dv S )Nr   )RebootPendingRebootCompleted ds    r   <lambda>z$idrac_system_reset.<locals>.<lambda>y  s    *9](] r   r   r   Id)r   r   zjob is not complete)r   rD   SYSTEM_RESET_URIr*   rB   rC   get_job_urilistfilterrE   r   get_job_uri_idrG   r   )r   r   payloadr   r   r   r   r   rY   r   ro   jobrX   s                r   idrac_system_resetr   q  s   $(%%LI-44F4CVRYZ

2''E(:EBDv]_c_m_mnw_xyzC =e^TYEZEaEabefgbhimbnEoGO^k!m#(C/',c9E E ,	833  	s   B;C C#"C#c                     t         }d}	 | j                  t        d      }|j                  j	                  d      }|d   j	                  t
              }|j                  d      d   }||fS # t        $ r d}Y ||fS w xY w)Nr"   r>   r   r   r   r   z]Unable to complete the request because the resource URI does not exist or is not implemented.)	SYSTEM_IDrD   SYSTEMS_URIrE   rF   r   r$   r
   )r   r   	error_msgro   memberr   s         r   get_system_res_idr     s    FI(##K7
 ##I.)--)s#B'9  <<	 9<s   A+ +A<;A<c           	         ddg }}}	 | j                  d||      }|j                  j                  dd      }|j                  j                  d      }|=|j                         D ]*  \  }}|dj	                  ||j                  dd	            z  }, ||r!d
j	                  |j                  d      |      n|j                  d      }	| j                  d|	      }|j                  |j                  j                  d             |j                  j                  dd      }|||dS # t        t        t        t        t        t        f$ r}
|
d}
~
ww xY w)zDTo get all the devices with pagination based on the filter provided.r"   Nr>   )query_paramz@odata.nextLinkrh   z{0}={1} z%20z{0}&{1}z/api)resp_objreport_list)rD   rE   rF   itemsr*   replacer(   extendr   r
   r   r   	TypeError
ValueError)ome_objrl   r   queryro   r   next_urir   r{   next_uri_queryr\   s              r   get_all_data_with_paginationr     sO   !44E%%eSk%J>>%%&7>nn((1"#))+ D1))!QYYsE-BCCD"PUY--hnnV.DeL[c[i[ijp[qN))%@Dt~~11':;~~))*;TBH	 " [99 i!3_iQ[\ 	s   DD( (#EEEc                 @   	 t        | t              rYt        | j                               D ]:  }t	        j
                  ||      r| j                  |d       ,t        | |   |       < 	 | S t        | t              r| D ]  }t        ||        | S # t        $ r Y | S w xY w)z
    :param data: the dict/list to be stripped of unwanted keys
    :param remove_char: the substring to be checked among the keys
    :return: dict/list
    N)	
isinstancerk   r   r   r%   r&   r   
remove_keyrG   )r   regex_patternrg   rf   s       r   r   r     s    dD!DIIK( 988M3/HHS$'tCy-8	9 K d# 04/0 K  Ks   A&B +#B 	BBc                    di d}}}	 | j                  dt        j                  |      |d      }t        j                  d       |rf|j
                  dk(  rW| j                  d	t        |             }t        t        d
 |j                  d               }t        |d       }|rd}nt        }|||fS # t        $ r d}Y w xY w)NFr"   r   r   x   )r   api_timeoutr      r>   c                     | d   dv S )NJobType)RebootNoForcer   r   s    r   r   z-wait_for_redfish_reboot_job.<locals>.<lambda>  s    AiLDU4U r   r   c                 4    t        j                  | d   d      S )N	StartTimez%Y-%m-%dT%H:%M:%S)r   strptimer   s    r   r   z-wait_for_redfish_reboot_job.<locals>.<lambda>  s    9J9J1[>[n9o r   )rg   T)rD   r   r*   rB   rC   status_coder   r   r   rE   maxr   rG   )	r   r   r   r   r   rY   rX   ro   reboot_job_lsts	            r   wait_for_redfish_reboot_jobr     s     "bS8E))&2B2I2IQW2I2X_ftw)x

2T--4--e[5MND!&)VX\XfXfgpXq"rsN>/opH  UC  s   B&B3 3C Cc                    |}|}dj                  |      }i }|r|r||kD  r||z
  }n|}d}t        j                  |       | j                  d|d      }|j                  j                  d      dk(  rt        j                  d       |d	fS |j                  j                  d
      dk(  rt        j                  d       ||fS |r||fS t        j                  d       | j                  d|d      }|d	fS )Nr   r   r>   r   )r   r~   r   r   r"   r   r   r   )	r   rI   r   r   r   r   r   r   rY   s	            r   wait_for_redfish_job_completer     s   !NN:AA,OGH.!/.!@!/!"JJ~&"11%c1RH!!%%&78C?

2|#!!%%j1^C

2(( $ W 	

2--eW#-N|r   c                     t        | j                        d   }d|v rd|ind|i} | j                  dddi|j                  }|r
||v r||   S y |S )Nr   rl   pathmethodr>   r   )r	   rD   rE   )	idrac_objbase_urisearch_labelargsr   ro   s         r   get_dynamic_urir     sl    )223A6D %E8FH3ED#9##959D9CCD4%%Kr   c                    h dt        | j                        d   }d|v rdt        |       indt        |       i} | j                  dddi|j                  j	                  dg       }t        t              rt        fd|D        i       }n&t        t              rt        fd	|D        i       }t        d
      S )N>   NewRunning	Scheduledr   rl   r   r   r>   r   c              3   t   K   | ]/  }|j                  d       v s|j                  d      k(  s,| 1 ywr   r   Nrd   re   j	job_statejob_types     r   ri   z)get_scheduled_job_resp.<locals>.<genexpr>  s6     tqz1Bi1OVWV[V[\eVfjrVrts   888c              3   r   K   | ].  }|j                  d       v s|j                  d      v s+| 0 ywr   rd   r   s     r   ri   z)get_scheduled_job_resp.<locals>.<genexpr>  s6     tqz1Bi1OVWV[V[\eVfjrVrts   777z(.*?)@odata)r   r   )
r	   rD   r   rE   rF   r   r   nextr   r   )r   r   r   r   job_listrY   r   s    `    @r   get_scheduled_job_respr     s    /I)223A6D.3tmE;y)*&+V_J`AaD'y''=u==GGKKIWYZH(C tHtvxy	Hd	#tHtvxyhm<<r   c                 p    | j                  t        |       j                  |      d      }|j                  S )NDELETE)rl   r   )rD   r   r*   rE   )r   job_idro   s      r   
delete_jobr    s2    ##y(A(H(H(PYa#bD>>r   c                     t        |       }| j                  t        dz   |z   d      }|j                  j	                  d      }|j                  j	                  d      }||fS )Nr   r>   DateTimeDateTimeLocalOffset)r   rD   r   rE   rF   )r   r   ro   	curr_timedate_offsets        r   get_current_timer
    s\    ,F%%lS&86&A5ID"":.I..$$%:;Kk!!r   c                     d}d}| j                         D ]1  \  }}t        j                  dd|      }|dj                  ||      z  }3 |r||z  }|j                  ||      }|S )Nz%<Component FQDD="{0}">{1}</Component>r"   z\.(?!\d)#z%<Attribute Name="{0}">{1}</Attribute>)r   r%   r1   r*   )		attr_dictfqddcustom_payload_to_add	componentattrr   r{   rg   roots	            r   xml_data_conversionr    sy    ;ID! G1ff[#q)7>>sAFFG %%D$'DKr   c                 D   d}d }| r+t        | t              s| j                  j                  d      } t	        ||d      }|D ]0  }| s| |t
           j                  d      d   k(  s%|t
           }d} n |s| r|t        j                  | d      fS | |d   t
           }|dfS )	NFresource_idr   r   r   Tr   r"   )	r   r   paramsrF   r   r   r$   INVALID_ID_MSGr*   )r  r   r   found
res_id_urires_id_memberseachs          r   &validate_and_get_first_resource_id_urir    s    EJ:k37!((,,];$UHi@N ;$x.*>*>s*CB*GGhJE	
 [>00( ( 	(		#A&x0
r>r   c                     t        | j                        d   }d|v rdt        indt        i} | j                  dddi|}|j                  j	                  dd      S )	Nr   rl   r   r   r>   FirmwareVersionr"   r   )r	   rD   GET_IDRAC_FIRMWARE_VER_URIrE   rF   )r   r   r   firm_versions       r   get_idrac_firmware_versionr!  /  sd    %../2D274-E-.fNhEiD'5''=u==L!!%%&7<<r   c                 d    | j                  dt              }|j                  j                  d      S )Nr>   Version)rD   OME_INFOrE   rF   )r   ro   s     r   get_ome_versionr%  6  s)    !!%2D>>i((r   c                     i i }}t        || t              \  }}|r||fS t        | |d      j                  di       j                  dd      }d|i}| j	                  d||      }||fS )NActions#ComputerSystem.Resettargetr"   r   r   )r   rl   r   )r  r   r   rF   rD   )r   restart_typer  ro   r   rl   actions_urir   s           r   trigger_restart_operationr,  ;  s    ")D;KP[\NCY!%i8<<=TVXY]]^fhjkKL)Gv;WMD?r   c                    d\  }}d}d}d|z  }||k\  rt        j                  |       ||z
  }||z  }	t        || t              \  }
}|r||fS t	        | |
d      }|j                  di       j                  di       j                  di       j                  t        i       }|r?t	        | |      }|j                  d	i       j                  d
i       j                  di       }n|t        fS | j                  |ddd      }|j                  j                  d      }||	k  rY	 | j                  |ddd      }|j                  j                  d      }|dk(  rd}n t        j                  |       |dz   }||	k  rY||	k(  r|dk7  rt        j                  ||      }||fS # t        $ r; t        j                  |       |dz   }||	k(  rt        j                  d|	      }Y fY nw xY w)N)Fr"   r"   r!      LinksOemDellDellLCServicer'  z)#DellLCService.GetRemoteServicesAPIStatusr)  r   z{}F)r   dumpLCStatusReadyTunreachable)	lc_statusretries)rB   rC   r  r   r   rF   r   UNSUPPORTED_LC_STATUS_MSGrD   rE   r   LC_STATUS_MSGr*   )r   job_wait_timeoutr  r   lc_status_completedr   lcstatusretry_countwaiting_before_lc_status_checkmax_idrac_reset_tryrl   ro   urlaction_resplc_urllc_resps                   r   wait_for_lc_statusrE  F  s   %."HK &((]"99

12+.LL*h6;KP\]NC"I--5#w/D
((5"

!
!&"
-
1
1/2
F
J
J8UW
XC
%eS1B/334_acdhhiqsuv"$===""665"IG  $$Z0H
+
+	**665*QG((,,Z8H7"&*#JJx %/K +
+ ))h'.A!((8[(Q		))  	JJx %/K11)00=Re0f	 2	s   7F F ?G G c                    d}d}t        || t              \  }}|r||fS t        | |d      j                  t        i       }t        | |d      }	|	D 
cg c])  }
|
t           j                  d      d   dk(  r	|
t           + c}
d   }t        | |d	      j                  t        i       }	 | j                  |d
      }| j                  |d
      j                  j                  d      }|s|j                  j                  d      }|s|S |D ]F  }|j                  d      |k\  s|D ]*  }||j                  d      v sd}|j                  d      } F H 	 ||fS c c}
w # t        $ r d}Y ||fS w xY w)NFzNo LC log found.LogServicesr   r   r   Lclogr   Entriesr>   r  Created	MessageIdTMessage)	r  r   r   rF   r   r$   rD   rE   rG   )r   r  lc_log_ids_listr  lc_log_foundrX   rl   r   log_services_urilog_svc_memberr  
log_lc_urilog_entries_uriro   	logs_listlogerr_ids                    r   get_lc_log_or_current_log_timerV  q  s   L
C;ULNC Y&&&uc=AEE" %U,<iHN #>$R(G3 	X 		J
 &z9	c(B !##J6((%@JJNN
	 **:6I 	Cwwy!Y.- F!55'+!ggi0		 A:  ! !s+   .E'AE E E 8E E+*E+c                    | j                  d      }t        |      }d|v r|j                  d      nd}|dk7  rd|z
  dz   }dg|z  |||dz    |D cg c]  }|j                  d       }}dj	                  |      }|S c c}w )Nr    r"   r      r!   0000   )r$   r2   indexzfillr4   )ipsectionsnum_sectionsdouble_colon_indexmissing_sectionssectionexpanded_ips          r   expand_ipv6rd    s    xx}Hx=L/1X~+2R|+a/?EhIY>Y#$6$:;089Wa 9H9((8$K :s   A>c                     t        j                         }t        |       j                  dd      }| | d|j	                  |       | }|S )Nr    ._)r   nowrd  r   strftime)r]  prefixpostfixdatetime_formatrh  r+   r   s          r   cert_file_format_stringrm    sL     ,,.C2&&sC0HXhZqo!> ?yIDKr   c                 v    |}|r2t        | |      }||v rd}	 |S t        j                  |       |dz
  }|r2d}|S )NTr!   F)get_power_staterB   rC   )r   r   desired_stater8  r   r#   psachieveds           r   track_power_staters    sU    E
UH-H O	 JJx 	  Or   c                     d}d}|dkD  r1	 | j                  |d      }|j                  j                  d      }	 |S |S # t        $ r |dz
  }Y nw xY w|dkD  rM)Nr   r_   r   r>   
PowerStater!   )rD   rE   rF   rG   )r   r   r8  pstatero   s        r   ro  ro    sp    GF
A+	"''%8D^^''5F M6M  	"kG	" A+s   -= AAc                     	 i i }}t        d | |      \  }}|ryt        | |d      j                  di       j                  dd      }| j                  |dd|i       d	}|S # t        $ r d}Y |S w xY w)
NFr'  r(  r)  r"   r   r   r   T)r  r   rF   rD   r
   )r   
system_urip_state_respr   rl   r+  p_acts           r   power_act_hostr|    s    	ry?eZXY%eS)<@@AXZ\]aabjlno[&W7MN L  Ls   A  AA   A/.A/c                     d}t        | |      }dg}||v rAd}d|v rd}t        | ||      }|syt        | |dg      }d}|st        j                  d       d}t        | ||      }|syt        | ||      }|S )	NOnGracefulShutdownForceForceOffFOffr   ForceRestart)ro  r|  rs  rB   rC   )	r   r*  rx  r   ry  rq  on_stater{  state_achieveds	            r   
reset_hostr    s    G		)BvH	X~$l" Guj':*5(UGDJJrN$G5*g6E&uhANr   c                     | j                   j                  d      }| j                   j                  d      }|r||dk  ryy)aE  
    Validates job_wait and job_wait_timeout parameters.
    :param module: The Ansible module instance.
    :param job_wait_param: The name of the job wait parameter to check (default is "job_wait").
    :param job_wait_timeout_param: The name of the job wait timeout parameter to check (default is "job_wait_timeout").
    r   r;  r   TF)r  rF   )moduler   r;  s      r   validate_job_waitr    sE     }}  ,H}}(();<%-1AQ1Fr   c                     t        | t              s|j                  dd       | r/t        j                  d|       s|j                  t
        d       y y y )Nz%Time must be a string in HH:MM formatT)rX   failedz^(?:[01]\d|2[0-3]):[0-5]\d$)r   r   	exit_jsonr%   r&   INVALID_TIME_FORMAT_MSG)rB   r  s     r   validate_timer    sO    dC DTR BHH;TB4TB Ctr   c                 T    t        |       }t        }|j                         st        }|S rc   )r   MANAGER_JOB_ID_URIis_omsdk_requiredMANAGER_JOB_ID_URI_10)rH   firmware_obj
job_uri_ids      r   r   r     s(    $X.L#J))+*
r   c                 T    t        |       }t        }|j                         st        }|S rc   )r   MANAGER_JOB_URIr  MANAGER_JOB_URI_10)rH   r  rI   s      r   r   r     s'    $X.LG))+$Nr   )@odata.F)X  )LastRunStatusr   )i  i  i*  )i  i5  i6  i7  )i  i  i  i4  r   r   r!   )r  r   )	Completed
DownloadedCompletedWithErrorsr   )Failedr   r_   )
r   r   
Schedulingr   DownloadingWaitingPausedr   PendingActivationReadyForExecutionr   r   r!   )zDeviceService/Devicesr   
Identifierrh   )Namerh   )Tr   r   )r   )NTr   r   rc   )r  )Nr   )r"   )NN)r   N)r   Nr   )NNN)r"   r"   z%Y%m%d_%H%M%S)X
__future__r   r   r   type__metaclass__CHANGES_MSGNO_CHANGES_MSGr   r   r   r  r9  r:  r   r   r   r   CHASSIS_URIr   r   r  r  r  r  r  r'   r$  r   POWER_CHECK_RETRIESPOWER_CHECK_INTERVAL!GET_IDRAC_FIRMWARE_DETAILS_URI_10GET_IDRAC_FIRMWARE_URI_10TIMEOUT_NEGATIVE_OR_ZERO_MSGr  rB   r   inspectr	   r%   +ansible.module_utils.six.moves.urllib.errorr
   ansible.module_utils.urlsr   r   r   Uansible_collections.dellemc.openmanage.plugins.module_utils.idrac_utils.info.firmwarer   r   r.   r)   r]   r`   rp   rv   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r!  r%  r,  rE  rV  rd  rm  rs  ro  r|  r  r  r  r   r   r   r   r   <module>r     s  8 C B,2d4[
NQ o	
#%#GN SE _ Q \ $  $n !V k X    " 	 A I K7*  I`Ia$<PQB0L @Ja=MGH20jQ,& .1b *Q44,:(* $6	=
"	&=)
(*V.b	 (*$&,; ?R\p 
. Cr   