+
    -i[;                     Z   ^ RI t ^ RIt^ RIHtHt ^ RIHtHtHtHtH	t	 ^ RI
HtHt ^ RIHt ^ RIHt ^RIHt ^RIHt ^R	IHt ^R
IHtHtHtHtHt ^RIHtHtH t H!t! ^ RI"t"]"PF                  ! ]$4      PJ                  R,          t&]! ]'! ]&4      R7      t(]! 4       t)R R lt*])PW                  R]R7      R R l4       t,])P[                  R]R7      ]! R4      ]! R4      ]! ]4      3R R ll4       t.])PW                  R4      R R l4       t/])PW                  RRR7      R R l4       t0])PW                  R]R7      RR]! ]4      ]! ]4      3R  R! ll4       t1])PW                  R"]R7      ]! ]4      ]! ]4      3R# R$ ll4       t2])P[                  R%4      ]! ]4      ]! ]4      3R& R' ll4       t3])PW                  R(]R7      ]! ]4      ]! ]4      3R) R* ll4       t4])P[                  R+4      ]! R4      ]! R,4      ]! ]4      ]! ]4      3R- R. ll4       t5])P[                  R/4      ]! ]4      ]! ]4      3R0 R1 ll4       t6])P[                  R24      ]! ]4      ]! ]4      3R3 R4 ll4       t7R5 R6 lt8])P[                  R74      ]! ]4      ]! ]4      3R8 R9 ll4       t9])PW                  R:]R7      R]! ]4      ]! ]4      3R; R< ll4       t:])PW                  R=]R7      ]! ]4      ]! ]4      3R> R? ll4       t;])P[                  R@4      ]! ]4      ]! ]4      3RA RB ll4       t<])PW                  RC]R7      ]! ]4      ]! ]4      3RD RE ll4       t=])P[                  RF4      ]! R,4      ]! R,4      ]! R,4      ]! ]4      ]! ]4      3RG RH ll4       t>])P[                  RI4      ]! ]4      ]! ]4      3RJ RK ll4       t?R# )L    N)datetimetimezone)	APIRouterDependsFormHTTPExceptionRequest)HTMLResponseRedirectResponse)Jinja2Templates)Session)require_admin)settings)get_db)AdminAgentEnrollmentTokenGroupTask)awareformat_uptimerelative_timestatus_label	templates)	directoryc                >    V ^8  d   QhR\         R\        R,          /# )   requestreturnN)r	   str)formats   "server/app/views.py__annotate__r#      s      G d
     c                 >    V P                   P                  R R4      pV# )flashN)sessionpop)r   msgs   & r"   _flashr*      s    
//

gt
,CJr$   /login)response_classc                0    V ^8  d   QhR\         R\        /# r   r   r   )r	   r
   )r!   s   "r"   r#   r#   !   s     h h hL hr$   c                     V P                   P                  R 4      '       d   \        RRR7      # \        P	                  V RR\        V 4      RR/4      # )user/devices/  status_code
login.htmlr&   errorN)r'   getr   r   TemplateResponser*   r   s   &r"   
login_pager:       sH    6""
<<%%g|gvgX_ae=fggr$   .c          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# )r   r   usernamepassworddbr   )r	   r    r   r
   )r!   s   "r"   r#   r#   (   s:     9 999 9 		9
 9r$   c                 :   ^RI Hp VP                  \        4      P	                  VR7      P                  4       pV'       d   V! W%P                  4      '       g   \        P                  V RRRRR/RR	7      # VP                  V P                  R
&   \        RRR	7      # )   )verify_password)r<   r5   r&   Nr6   zInvalid credentialsi  r3   r0   r1   r2   )authrA   queryr   	filter_byfirstpassword_hashr   r8   r<   r'   r   )r   r<   r=   r>   rA   admins   &&&&  r"   do_loginrH   '   s     &HHUO%%x%8>>@E2E2EFF))\GT7<Q#R`c * 
 	
 $nnGOOFJC88r$   z/logoutc                0    V ^8  d   QhR\         R\        /# r.   r	   r   )r!   s   "r"   r#   r#   :   s     7 7G 7 0 7r$   c                 P    V P                   P                  4        \        R RR7      # )r+   r2   r3   )r'   clearr   r9   s   &r"   logoutrM   9   s    OOH#66r$   /F)include_in_schemac                0    V ^8  d   QhR\         R\        /# r.   rJ   )r!   s   "r"   r#   r#   C   s     9 97 9/ 9r$   c                 x    V P                   P                  R 4      '       g   \        RRR7      # \        RRR7      # )r0   r+   r2   r3   r1   )r'   r7   r   r9   s   &r"   indexrR   B   s1    ??v&&c::JC88r$   r1   c                |    V ^8  d   QhR\         R\        R,          R\        R,          R\        R\        R\
        /# )r   r   groupNqrG   r>   r   )r	   intr    r   r   r
   )r!   s   "r"   r#   r#   M   sL     ' '':' Tz' 	'
 	' 'r$   c                    VP                  \        4      pV'       d@   VP                  \        P                  4      P	                  \
        P                  V8H  4      pV'       dY   R V R 2pVP	                  \        P                  P                  V4      \        P                  P                  V4      ,          4      pVP                  \        P                  P                  4       4      P                  4       p. pV F  p	V	P                  '       d.   \        V	P                  V	P                  ,          ^d,          4      M^ p
V	P                   '       d.   \        V	P"                  V	P                   ,          ^d,          4      M^ pVP%                  RV	R\'        V	P(                  4      RV
RVR\+        V	P,                  4      R\/        V	P(                  4      /4       K  	  \0        P3                  V RRR	R
VRVP                  \
        4      P                  \
        P4                  4      P                  4       RVRVR\7        V 4      /4      # )%agentstatusmem_pctdisk_pctuptime	last_seenzdevices.htmlactivedevicesrowsgroupsselected_group_idrU   r&   )rC   r   joinrb   filterr   idhostnameilike
ip_addressorder_byascallmem_total_mbrV   mem_used_mbdisk_total_gbdisk_used_gbappendr   r^   r   uptime_secondsr   r   r8   namer*   )r   rT   rU   rG   r>   rC   likeagentsra   ar[   r\   s   &&&&&       r"   devices_pagerw   L   s    HHUOE

5<<(//E0AB1#Qxenn2248U=M=M=S=STX=YZ[^^ENN..01557FD?@~~~#ammann4s:;STBC///3q~~7#=>WXQl1;;/wmA$4$45q{{3
 	  %%iDbhhuo..uzz:>>@VG_	
 r$   z/devices/{agent_id}c          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   agent_idr   rG   r>   r   )r    r	   r   r   r
   )r!   s   "r"   r#   r#   x   s:        		
 r$   c                    VP                  \        4      P                  V R 7      P                  4       pV'       g   \	        RRR7      hVP                  \
        4      P                  \
        P                  VP                  8H  4      P                  \
        P                  P                  4       4      P                  ^4      P                  4       p\        P                  TRRRRTR\        VP                   4      R	\#        VP$                  4      R
\'        VP                   4      R\'        VP(                  4      RV Uu. uF  pRVR\'        VP*                  4      /NK  	  upR\-        V4      /4      # u upi )rz     zDevice not foundr4   detailzdevice_detail.htmlr_   r`   rY   rZ   r]   r^   enrolledtaskstaskcreatedr&   )rC   r   rD   rE   r   r   re   agent_pkrf   rj   desclimitrl   r   r8   r   r^   r   rr   r   enrolled_at
created_atr*   )rz   r   rG   r>   rv   r   ts   &&&&   r"   device_detailr   w   s     	!!8!4::<A4FGG
	%	&	$'',,.	!	r	 
 %%iQl1;;/mA$4$45q{{3amm4SXYSXavq)]1<<-HISXYVG_		
  Zs   >"E3&z/devices/{agent_id}/deletec          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# ry   )r    r	   r   r   r   )r!   s   "r"   r#   r#      s:     9 999 9 		9
 9r$   c                    VP                  \        4      P                  V R 7      P                  4       pV'       d?   VP	                  V4       VP                  4        RVP                   R2VP                  R&   \        RRR7      # )r|   zRemoved .r&   r1   r2   r3   )	rC   r   rD   rE   deletecommitrg   r'   r   )rz   r   rG   r>   rv   s   &&&& r"   delete_devicer      sg     	!!8!4::<A
		!
		%-ajj\#; JC88r$   /groupsc                H    V ^8  d   QhR\         R\        R\        R\        /# r   r   rG   r>   r   r	   r   r   r
   )r!   s   "r"   r#   r#      s0       	 	r$   c                 J   \         P                  V R RRRVP                  \        4      P	                  \        P
                  4      P                  4       RVP                  \        4      P	                  \        P                  4      P                  4       R\        V 4      /4      # )zgroups.htmlr_   rb   
all_agentsr&   )
r   r8   rC   r   rj   rs   rl   r   rg   r*   )r   rG   r>   s   &&&r"   groups_pager      sz     %%hbhhuo..uzz:>>@"((5/225>>BFFHVG_		
	 	r$   z/groups/create c                `    V ^8  d   QhR\         R\        R\        R\        R\        R\        /# )r   r   rs   descriptionrG   r>   r   r	   r    r   r   r   )r!   s   "r"   r#   r#      sD     8 88
8 8 	8
 	8 8r$   c                    VP                  4       pV'       g   R V P                  R&   \        RRR7      # VP                  \        4      P                  VR7      P                  4       '       d!   RV R2V P                  R&   \        RRR7      # VP                  \	        WR7      4       VP                  4        R	V R
2V P                  R&   \        RRR7      # )zName required.r&   r   r2   r3   )rs   zGroup 'z' already exists.)rs   r   zCreated group r   )	stripr'   r   rC   r   rD   rE   addr   )r   rs   r   rG   r>   s   &&&&&r"   groups_creater      s     ::<D#3 	s;;	xx  d +1133%,TF2C#D 	s;;FF5d45IIK!/vQ7GOOGI377r$   z/groups/{group_id}/deletec          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   group_idr   rG   r>   r   rV   r	   r   r   r   )r!   s   "r"   r#   r#      s:     8 888 8 		8
 8r$   c                     VP                  \        V 4      pV'       d?   VP                  V4       VP                  4        R VP                   R2VP
                  R&   \        RRR7      # )zDeleted group r   r&   r   r2   r3   )r7   r   r   r   rs   r'   r   )r   r   rG   r>   gs   &&&& r"   groups_deleter      sS     	uhA
		!
		%3AFF81#= I377r$   z/groups/{group_id}/membersc          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   r   )r!   s   "r"   r#   r#      s:     8 888 8 		8
 8r$   c                   "   VP                  4       G R j  xL
 pVP                  R4      pVP                  \        V 4      pV'       g   \	        RRR7      hVP                  \        4      P                  \        P                  P                  V4      4      P                  4       Vn        VP                  4        RVP                   R\        VP                  4       R2VP                  R&   \!        R	R
R7      #  L5i)N	agent_idsr}   zGroup not foundr~   zUpdated z: z member(s).r&   r   r2   r3   )formgetlistr7   r   r   rC   r   re   rz   in_rl   membersr   rs   lenr'   r   )r   r   rG   r>   r   selectedr   s   &&&&   r"   groups_set_membersr      s      D||K(H
uhA4EFF&&u~~'9'9('CDHHJAIIIK!)!&&C		N3C;OGOOGI377  s   C=C;2C=
B2C=c                R    V ^8  d   QhR\         R\        \        \         3,          /# )r   r   r   )dicttupler    )r!   s   "r"   r#   r#      s'     R R R%T	"2 Rr$   c           
      p   V P                  R R4      pVR8X  d%   VRV P                  RR4      P                  4       /3# VR8X  d0   V P                  R4      ;'       g    RP                  4       pVRV/3# VR8X  dI   V P                  R4      ;'       g    V P                  R4      ;'       g    RP                  4       pVRV/3# VR8X  d   V/ 3# VR	8X  d   V P                  R
R4      pTRV P                  RR4      P                  4       RV P                  RR4      P                  4       ;'       g    RR\        P                  ! VP                  4       4      P                  4       /3# VR8X  d   V/ 3# VR8X  d   V/ 3# VR8X  d%   VRV P                  RR4      P                  4       /3# \        RRV 2R7      h)typeshellcommandr   apt_installpackages
apt_removepackages_removeapt_upgrade	push_filecontentpathmode0644content_b64rebootshutdownset_wallpaperurlwallpaper_url  zUnknown task type r~   )r7   r   splitbase64	b64encodeencodedecoder   )r   	task_typepkgsr   s   &   r"   _build_payloadr      s   )IG9dhhy"&=&C&C&EFFFM!$**113:t,,,L *+IItxx
/CIIrPPR:t,,,M!"}K((9b)DHHVR(..0DHHVV,224>>6++GNN,<=DDF
 
 	

 H"}J"}O#5$((?B"?"E"E"GHHH
C2DYK0P
QQr$   z/tasks/createc                H    V ^8  d   QhR\         R\        R\        R\        /# r   )r	   r   r   r   )r!   s   "r"   r#   r#     s0     27 272727 	27 	27r$   c                   "   V P                  4       G R j  xL
 pVP                  4        Uu/ uF  qDVP                  V4      bK  	  pp\        V4      w  rgVP                  R4      pVP                  R4      p	VP                  R4      R8H  p
. pV
'       d%   VP	                  \
        4      P                  4       pMV	'       d>   VP                  \        \        V	4      4      pV'       d   \        VP                  4      pMFV'       d?   VP	                  \
        4      P                  VR7      P                  4       pV'       d   V.pV'       g7   RV P                  R&   \        V P                  P                  RR	4      R
R7      # ^RIHpHpHp ^ R IpWo9  d   \+        RRR7      hV! Wg4       VP-                  4       P.                  pV! Wg4      pV F7  pVP1                  \3        VP4                  VVVP6                  VVR7      4       K9  	  VP9                  4        RV R\;        V4       R2V P                  R&   V'       d!   \;        V4      ^8X  d   \        RV 2R
R7      # \        R	R
R7      #  ELYu upi 5i)Ntarget_agent_idtarget_group_id
target_all1r|   z(No matching devices to send the task to.r&   referer/tasksr2   r3   )_default_titleVALID_TASK_TYPES_validate_payloadr   zBad task typer~   )r   r   payload
created_bybatch_idtitlezQueued 'z' for z device(s).z	/devices/)r   keysr7   r   rC   r   rl   r   rV   listr   rD   rE   r'   r   headers	api_adminr   r   r   uuidr   uuid4hexr   r   rf   r<   r   r   )r   rG   r>   r   k	form_dictr   r   r   r   r   targetsr   rv   r   r   r   r   r   r   s   &&&                 r"   tasks_create_viewr     s     D)-5ADHHQKI5'	2Ihh01Ohh01O,'3.JG((5/%%'	FF5#o./199oG	HHUO%%%?EEGcG#M  3 3Ix HVYZZNN(ODDi)zz|H9.E
tTT~~
 	  IIK!)%s7|nKPGOOG3w<1,)O+< =3OOH#66[  5s;   I7I/I7I2A:I7AI7:I7
I7D#I72I7r   c          
      b    V ^8  d   QhR\         R\        R,          R\        R\        R\        /# )r   r   rZ   NrG   r>   r   )r	   r    r   r   r
   )r!   s   "r"   r#   r#   H  s>      $J  		
 r$   c                    VP                  \        4      pV'       d#   VP                  \        P                  V8H  4      pVP	                  \        P
                  P                  4       4      P                  ^4      P                  4       p\        P                  T RRRRV Uu. uF  pRVR\        VP                  4      /NK  	  upRVR\        V 4      /4      # u upi )	   z
tasks.htmlr_   r   ra   r   r   status_filterr&   )rC   r   re   rZ   rj   rf   r   r   rl   r   r8   r   r   r*   )r   rZ   rG   r>   rC   r   r   s   &&&&   r"   
tasks_pager   G  s     HHTNET[[F23NN477<<>*00599;E%%gRWXRWQfaM!,,,GHRWXVVG_		
	 	
 Ys   ""Cz/tasks/{task_id}c          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   task_idr   rG   r>   r   )rV   r	   r   r   r
   )r!   s   "r"   r#   r#   _  s:        		
 r$   c                    VP                  \        V 4      pV'       g   \        R RR7      h\        P                  ! VP
                  ;'       g    / ^R7      p\        P                  TRRRRTRTR	\        VP                  4      R
VP                  '       d   \        VP                  4      MRRVP                  '       d   \        VP                  4      MRR\        V4      /4      # )r}   zTask not foundr~   )indentztask_detail.htmlr_   r   r   payload_jsonr   
dispatchedN	completedr&   )r7   r   r   jsondumpsr   r   r8   r   r   dispatched_atcompleted_atr*   )r   r   rG   r>   r   r   s   &&&&  r"   task_detailr   ^  s     	tWA4DEE::aiioo2a8L%%gAL}Q\\2AOOO-8QU!...q~~6dVG_	
 r$   z/tasks/{task_id}/cancelc          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# r   r   )r!   s   "r"   r#   r#   y  sA     W WWW W 		W
 Wr$   c                 Z   VP                  \        V 4      pV'       dh   VP                  R 8X  dW   RVn        RVn        \        P
                  ! \        P                  4      Vn        VP                  4        RVP                  R&   \        VP                  P                  RR4      RR7      # )	pendingfailedzCancelled by adminzTask cancelled.r&   r   r   r2   r3   )r7   r   rZ   stderrr   nowr   utcr   r   r'   r   r   )r   r   rG   r>   r   s   &&&& r"   task_cancelr  x  sz     	tWAQXX"'!hll3
		#4 GOO//	8DRUVVr$   /enrollmentc                H    V ^8  d   QhR\         R\        R\        R\        /# r   r   )r!   s   "r"   r#   r#     s0       	 	r$   c                    V P                   P                  R R4      pVP                  \        4      P	                  \        P
                  P                  4       4      P                  4       p. p\        P                  ! \        P                  4      pV F  p\        VP                  4      pTP                  RTRVP                  R\!        VP"                  4      RVP                  '       d   \!        VP                  4      MRR\%        T;'       d    W8  4      /4       K  	  \&        P)                  T RR	R
RTRVP                  \*        4      P	                  \*        P,                  4      P                  4       R TR\.        P0                  ;'       g%    \3        V P4                  4      P7                  R4      R\9        V 4      /4      # )	new_tokenNtokendefault_groupcreated_relexpires_relneverexpiredzenrollment.htmlr_   
enrollmenttokensrb   
public_urlrN   r&   )r'   r(   rC   r   rj   rf   r   rl   r   r  r   r  r   
expires_atrq   r
  r   r   boolr   r8   r   rs   r   r  r    base_urlrstripr*   )	r   rG   r>   r  
tokens_rawr  r  r   exps	   &&&      r"   enrollment_pager    sY    ##K6I/*33O4F4F4K4K4MNRRTJF
,,x||
$CALL!QQ__=6!,,,=6GtC--CI.
 	  %%lfbhhuo..uzz:>>@(--RRW5E5E1F1M1Mc1RVG_	
 r$   z/enrollment/createc                l    V ^8  d   QhR\         R\        R\        R\        R\        R\        R\        /# )r   r   labeldefault_group_idexpires_in_hoursrG   r>   r   r   )r!   s   "r"   r#   r#     sN      <  < < <  < 	 <
  < 	 <  <r$   c           	         ^ RI p^ RIHp VP                  4       '       d   \	        V4      MRpVe9   VP                  \        V4      '       g   RV P                  R&   \        RRR7      # Rp	VP                  4       '       dF    \	        V4      p
V
^ 8  d3   \        P                  ! \        P                  4      V! V
R7      ,           p	VP                  ^4      pVP                  \        VVP                  4       VV	R	7      4       VP!                  4        WP                  R
&   \        RRR7      #   \         d     Lui ; i)r   N)	timedeltazInvalid default group.r&   r  r2   r3   )hours)r	  r  r  r  r  )secretsr   r  r   rV   r7   r   r'   r   r  r   r  
ValueErrortoken_urlsafer   r   r   )r   r  r  r  rG   r>   r   r  r   r  r  token_values   &&&&&&      r"   enrollment_creater$    s    "(8(>(>(@(@s#$dHBFF5($;$;#; 3??J	()Eqy%\\(,,7)%:PP
 ''+KFF?kkm!	  IIK#.OOK Ms;;  		s   AD/ /D=<D=z/enrollment/{token_id}/revokec          
      T    V ^8  d   QhR\         R\        R\        R\        R\        /# )r   token_idr   rG   r>   r   r   )r!   s   "r"   r#   r#     s:     < <<< < 		<
 <r$   c                     VP                  \        V 4      pV'       d'   R Vn        VP                  4        RVP                  R&   \        RRR7      # )TzToken revoked.r&   r  r2   r3   )r7   r   revokedr   r'   r   )r&  r   rG   r>   r   s   &&&& r"   enrollment_revoker)    sB     	)A	
		#3 Ms;;r$   )@r   r   r   r   fastapir   r   r   r   r	   fastapi.responsesr
   r   fastapi.templatingr   sqlalchemy.ormr   rB   r   configr   r>   r   modelsr   r   r   r   r   utilsr   r   r   r   pathlibPath__file__parentTEMPLATE_DIRr    r   routerr*   r7   r:   postrH   rM   rR   rw   r   r   r   r   r   r   r   r   r   r   r  r  r$  r)   r$   r"   <module>r9     s     ' D D < . "    > > D D ||H%,,{:c,&78		 H\2h 3h Xl3 II&/	9 49" I7 7 C5)9 *9 J|4 =)&/' 5'T !,? =)&/	 @@ )* =)&/	9 +9" Il3 =)&/ 4"  S	Bx=)&/8 8( () =)&/	8 *8 )* =)&/	8 +8(R8 _ =)&/27 27j H\2 =)&/	 3, |< =)&/	 =2 &' =)&/	W (W& M,7 =)&/ 8@ !" b H H=)&/ < # <F ,- =)&/	< .<r$   