
    Ri                        d Z ddl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	 ej                  j                  d e ee      j                         j                  j                              Z e ee      dz  dz  d	z        Zd
Z G d de	      Z G d de	      Z G d de	      Z G d de	      ZdededefdZdedefdZdededdfdZdee   ddfdZdee   defdZdej<                  fdZd!dZ e!d k(  r e         yy)"u   시크릿 로테이션 체크 스크립트.

인벤토리 JSON을 읽어 각 시크릿의 만료 상태를 확인하고 보고한다.
    N)datetime)Path)	TypedDictWORKSPACE_ROOTmemorysecurityzsecret-inventory.json   c                   ^    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   y	)
SecretEntrynamesource_fileownercreated_datelast_rotatedexpires_datecategoryrotation_notesN)__name__
__module____qualname__str__annotations__     N/home/jay/workspace/.worktrees/task-2117-dev1/scripts/secret-rotation-check.pyr   r      s/    
IJMr   r   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)CheckResultr   statusr   days_remainingN)r   r   r   r   r   intr   r   r   r   r      s    
IKr   r   c                   6    e Zd ZU eed<   eed<   eed<   eed<   y)SummarytotalokwarningexpiredN)r   r   r   r    r   r   r   r   r"   r"   &   s    JGLLr   r"   c                   (    e Zd ZU ee   ed<   eed<   y)
JsonOutputresultssummaryN)r   r   r   listr   r   r"   r   r   r   r(   r(   -   s    +r   r(   secrettodayreturnc                     t        j                  | d   d      }||z
  j                  }|dk  rd}n|t        k  rd}nd}| d   || d   |dS )	u?   단일 시크릿의 만료 상태를 계산하여 반환한다.r   z%Y-%m-%dr   EXPIREDWARNINGOKr   )r   r   r   r   )r   strptimedaysWARNING_DAYS)r,   r-   expiresr   r   s        r   check_secretr7   2   sh    ~ 6
CGo++N	<	' v~.(	 r   inventory_pathc                 t    t        | dd      5 }t        j                  |      cddd       S # 1 sw Y   yxY w)u6   인벤토리 JSON 파일을 로드하여 반환한다.rutf-8encodingN)openjsonload)r8   fs     r   load_inventoryrB   F   s0    	ncG	4 yy|  s   .7	inventoryc                     t        j                         j                         |d<   t        | dd      5 }t	        j
                  ||dd       ddd       y# 1 sw Y   yxY w)	uX   last_checked 타임스탬프를 현재 시각으로 갱신하고 파일에 저장한다.last_checkedwr;   r<      F)indentensure_asciiN)r   now	isoformatr>   r?   dump)r8   rC   rA   s      r   update_last_checkedrM   L   sP     ( 8 8 :In	ncG	4 >		)Qqu=> > >s   AA r)   c                     | D ]s  }|d   }|d   dk(  r%t        d|d    d|d    dt        |       d	       5|d   d
k(  rt        d|d    d|d    d| d       Yt        d|d    d|d    d| d       u y)u8   텍스트 형식으로 결과를 stdout에 출력한다.r   r   r0   z
[EXPIRED] r   z - expires_date: r   z
 (overdue zd)r1   z
[WARNING] z (zd remaining)z
[OK]      N)printabs)r)   r:   r4   s      r   print_text_reportrQ   S   s     d!"X;)#Jqyk):1^;L:MZX[\`XaWbbdefx[I%Jqyk):1^;L:MRPTvUabcJqyk):1^;L:MRPTvUabcdr   c                     t        d | D              }t        d | D              }t        d | D              }| t        |       |||ddS )u0   JSON 출력 구조를 생성하여 반환한다.c              3   2   K   | ]  }|d    dk(  sd  yw)r   r2      Nr   .0r:   s     r   	<genexpr>z$build_json_output.<locals>.<genexpr>a   s     =8)<1=   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r1   rT   Nr   rU   s     r   rW   z$build_json_output.<locals>.<genexpr>b        GaakY.FGrX   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r0   rT   Nr   rU   s     r   rW   z$build_json_output.<locals>.<genexpr>c   rZ   rX   )r#   r$   r%   r&   )r)   r*   )sumlen)r)   ok_countwarning_countexpired_counts       r   build_json_outputra   _   sV    =g==HG7GGMG7GGM \$$	
 r   c                      t        j                  d      } | j                  dt        d       | j                  dddd	
       | j                  ddd       | j	                         S )u(   CLI 인자를 파싱하여 반환한다.u.   시크릿 로테이션 상태를 확인한다.)descriptionz--inventoryu8   인벤토리 JSON 파일 경로 (기본값: %(default)s))defaulthelpz--jsonjson_output
store_trueu(   결과를 JSON 형식으로 출력한다)destactionre   z--update-checkedu@   last_checked 타임스탬프를 현재 시각으로 갱신한다)ri   re   )argparseArgumentParseradd_argumentDEFAULT_INVENTORY
parse_args)parsers    r   rn   rn   p   s    $$1abF
!G  
 7	   O  
 r   c                     t               } t        | j                        }|j                  dg       }t	        j
                         j                  dddd      }|D cg c]  }t        ||       }}| j                  r,t        |      }t        t        j                  |d             nt        |       | j                  rt        | j                  |       t!        d |D              }t#        j$                  |rd       yd       yc c}w )	u   메인 진입점.secretsr   )hourminutesecondmicrosecondF)rI   c              3   *   K   | ]  }|d    dv   yw)r   )r0   r1   Nr   rU   s     r   rW   zmain.<locals>.<genexpr>   s     KaAhK#99Ks   rT   N)rn   rB   rC   getr   rJ   replacer7   rf   ra   rO   r?   dumpsrQ   update_checkedrM   anysysexit)argsrC   rq   r-   sr)   output	has_issues           r   mainr      s    <Dt~~.I!*y"!=GLLN""!A1"MEBI!JQ,q%"8!JG!J"7+djje45'"DNNI6K7KKIHH)Q## "Ks   D__main__)r.   N)"__doc__rj   r?   osr|   r   pathlibr   typingr   environrw   r   __file__resolveparent_WORKSPACE_ROOTrm   r5   r   r   r"   r(   r7   dictrB   rM   r+   rQ   ra   	Namespacern   r   r   r   r   r   <module>r      sN  
   	 
   **..!13tH~7M7M7O7V7V7]7]3^__-8:EH__` ) ) i  
 X + (3 4 > > > >	dtK0 	dT 	dtK0 Z "H&& ,$. zF r   