
    p
fA                        d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmc mZ ddlmc mZ ddlmc mZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddl m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2  G d de3      Z4 G d de3      Z5ddZ6d Z7d Z8d Z9ddZ:e;dk(  r e6        yy)z
Module agent
    )print_functionN)cgroupconfiguratorlogcollector)SystemdCgroupsApi)ustr)LogCollectorOUTPUT_RESULTS_FILE_PATH)
get_osutil)fileutiltextutil)FlexibleVersion)AddFirewallRules)
AGENT_NAMEAGENT_LONG_VERSIONAGENT_VERSIONDISTRO_NAMEDISTRO_VERSIONPY_VERSION_MAJORPY_VERSION_MINORPY_VERSION_MICROGOAL_STATE_AGENT_VERSIONget_daemon_versionset_daemon_version)CollectLogsHandler!get_log_collector_monitor_handler)ProvisionHandlerc                   @    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y)AgentCommandszN
    This is the list of all commands that the Linux Guest Agent supports
    zdeprovision+userdeprovisiondaemonstartzregister-servicezrun-exthandlersversionzshow-configurationhelpzcollect-logszsetup-firewall	provisionN)__name__
__module____qualname____doc__DeprovisionUserDeprovisionDaemonStartRegisterServiceRunExthandlersVersion
ShowConfigHelpCollectLogsSetupFirewall	Provision     7/usr/lib/python3/dist-packages/azurelinuxagent/agent.pyr   r   4   sE     )OKFE(O&NG%JD K$MIr6   r   c                   X    e Zd ZddZd Zd Zd ZddZd ZddZ	d	 Z
d
 Zed        Zy)AgentNc                    || _         t               | _        |rt        j                  j
                  nt        j                  j                  }t        j                  t        j                  j                  |       | j                   | j                   n| j                  j                         }t        j                  |       |xs t        j                         }|rt        j                  j
                  nt        j                  j                  }t        j                  t        j                  j                  |t        j                                t        j                          r%t#        j$                         s| j'                  |       t)        j*                         rVt        j                  t        j                  j,                  t        j                  j.                  t(        j0                         t        j2                         }	 t4        j6                  j9                  |      rt;        dj=                  |            t4        j6                  j?                  |      stA        jB                  |dd       t)        jF                  t        jH                                t4        j6                  jK                  t        jH                         t(        jL                        }t)        jN                  |       t)        jP                  d       y# t:        $ r/}t        jD                  dj=                  ||             Y d}~d}~ww xY w)	z7
        Initialize agent running environment.
        Npathz{0} is a filei  root)modeownerzBException occurred while creating extension log directory {0}: {1}WALA))conf_file_pathr
   osutilloggerLogLevelVERBOSEINFOadd_logger_appenderAppenderTypeSTDOUTget_agent_conf_file_pathconfload_conf_from_fileget_logs_verboseFILEget_agent_log_fileget_logs_consoler   is_provisioned_Agent__add_console_appendereventsend_logs_to_telemetry	TELEMETRYWARNINGadd_log_eventget_ext_log_dirosr<   isfile	Exceptionformatisdirr   mkdirerrorinit_event_statusget_lib_dirjoinEVENTS_DIRECTORYinit_event_loggerenable_unhandled_err_dump)selfverboserA   levelext_log_dire	event_dirs          r7   __init__zAgent.__init__G   s:    - l ,3''8L8L""6#6#6#=#=uE &&2 ,,==? 	 	  0 4T224+2''8L8L""6#6#6#;#;UI`I`Ibc   "+;+J+J+L''.'')&&v':':'D'D'-'>'>,1,?,?A **,	Aww~~k* 6 6{ CDD77==-{fE 	 0 0 23GGLL!1!1!3U5K5KL		*''/  	ALL))/Q)?A A	As   
A0L 	M%L??Mc                 d    t        j                  t         j                  j                  |d       y )Nz/dev/consoler;   )rC   rG   rH   CONSOLE)rf   rh   s     r7   __add_console_appenderzAgent.__add_console_appender|   s     ""6#6#6#>#>N[r6   c                 "   t        t               t        j                  d       t	        j
                         j                  d       | j                  dndj                  | j                        }ddl	m
}  |       }|j                  |       y)z"
        Run agent daemon
        r+   N-configuration-path:{0}r   )get_daemon_handler)
child_args)r   r   rC   
set_prefix	threadingcurrent_threadsetNamerA   r\   azurelinuxagent.daemonrr   run)rf   rs   rr   daemon_handlers       r7   r    zAgent.daemon   sy     	=)(#  "**84""* .55d6I6IJ 	 	>+-j1r6   c                 >    ddl m}  |       }|j                          y)z'
        Run provision command
        r   )get_provision_handlerN)azurelinuxagent.pa.provisionr|   ry   )rf   r|   provision_handlers      r7   r$   zAgent.provision   s     	G13r6   c                 D    ddl m}  |       }|j                  ||       y)z)
        Run deprovision command
        r   )get_deprovision_handler)forcedeluserN)azurelinuxagent.pa.deprovisionr   ry   )rf   r   r   r   deprovision_handlers        r7   r   zAgent.deprovision   s$     	K57eW=r6   c                 T   t        dj                  t                     | j                  j	                          t        dj                  t                     | j                  j                          t        dj                  t                     | j                  j                          y)z-
        Register agent as a service
        zRegister {0} servicezStop {0} servicezStart {0} serviceN)printr\   r   rB   register_agent_servicestop_agent_servicestart_agent_service)rf   s    r7   register_servicezAgent.register_service   sp     	$++J78**, ''
34&&(!((45'')r6   c                    t        j                  d       t        j                         j	                  d       t        j                         rit               t        d      k  rS| j                  t         j                  j                         	 t        j                  d       t        j                          ddlm}  |       }|j!                  |       y# t        j                          w xY w)z6
        Run the update and extension handler
        
ExtHandlerz2.2.53zThe agent will now check for updates and then will process extensions. Output to /dev/console will be suspended during those operations.r   )get_update_handlerN)rC   rt   ru   rv   rw   rK   rP   r   r   rR   rD   rF   infodisable_console_outputazurelinuxagent.ga.updater   ry   )rf   debugr   update_handlers       r7   run_exthandlerszAgent.run_exthandlers   s     	,'  "**<8   "'9';oh>W'W''(<(<=0  h  i--/@+-5!	 --/s   C C+c                     t        j                         }t        |j                               D ]   }t	        dj                  |||                " y )Nz	{0} = {1})rK   get_configurationsortedkeysr   r\   )rf   configurationks      r7   show_configurationzAgent.show_configuration   sG    ..0**,- 	;A+$$Qa(89:	;r6   c                 B   t        j                  d       |rt        j                  d       nt        j                  d       d\  }}}t        j                         rt               }|j                  d      \  }}t        j                  |v }t        j                  |v }|r|sft        j                  d       |st        j                  d       |st        j                  d       t        j                  t        j                         	 t        |||      }t        |j                        }|j!                          |j#                         }	t        j                  d	j%                  |	t&                     ||j/                          y y # t(        $ rt}
t        j*                  d
j%                  t-        |
                   t        j                  dj%                  t&                     t        j                  d       Y d }
~
d }
~
ww xY w# ||j/                          w w xY w)Nr   zRunning log collector mode fullz!Running log collector mode normal)NNNrf   z7The Log Collector process is not in the proper cgroups:z	unexpected cpu slicez	unexpected memory sliceznLog collection successfully completed. Archive can be found at {0} and detailed log output can be found at {1}z3Log collection completed unsuccessfully. Error: {0}z'Detailed log output can be found at {0}   )rC   rt   r   r   should_validate_cgroupsr   get_process_cgroup_pathsr   LOGCOLLECTOR_SLICEsysexitr   INVALID_CGROUPS_ERRCODEr   r   cgroupsry   collect_logs_and_get_archiver\   r	   r[   r_   r   stop)rf   is_full_modecpu_cgroup_pathmemory_cgroup_pathlog_collector_monitorcgroups_apicpu_slice_matchesmemory_slice_matcheslog_collectorarchiverj   s              r7   collect_logszAgent.collect_logs   s   .)KK9:KK;< FVB+-B557+-K2=2V2VW]2^/O/!3!F!F/!Y$6$I$IM_$_ $,@UV(KK 89+KK ;<==>	-(HZ[M$EmF[F[$\!!%%'#@@BGKK @@FwPh@ik %0%**, 1  	LLNUUVZ[\V]^_KKAHHIabcHHQKK	
 %0%**, 1s,   
A+F	 		HA*H<H	 HH	 	Hc                 ,   t        dj                  |              	 t        j                  | d   | d   | d          t        d       y # t        $ rB}t        dj                  t        |                   t        j                  d       Y d }~y d }~ww xY w)Nz8Setting up firewall for the WALinux Agent with args: {0}waitdst_ipuidz#Successfully set the firewall rulesz(Unable to add firewall rules. Error: {0}r   )r   r\   r   add_iptables_rulesr[   r   r   r   )firewall_metadatar_   s     r7   setup_firewallzAgent.setup_firewall   s     	HOOPabc	//0A&0IK\]eKf0A%0HJ78 	<CCDKPQHHQKK	s   +A 	B8BBN)FF)F)r%   r&   r'   rl   rR   r    r$   r   r   r   r   r   staticmethodr   r5   r6   r7   r9   r9   F   sF    30j\2 >	*"2;
'-R 	 	r6   r9   c                 t   | g } t        |       dk  rt        j                  dd } t        |       \  }}}}}}}|t        j
                  k(  rt                y|t        j                  k(  rt        t                      y|t        j                  k(  rt        |       y	 t        ||      }|t        j                  k(  r|j                  |d       y|t        j                  k(  r|j                  |d       y|t        j                   k(  r|j#                          y|t        j$                  k(  r|j'                          y|t        j(                  k(  r|j+                          y|t        j,                  k(  r|j/                  |       y|t        j0                  k(  r|j3                          y|t        j4                  k(  r|j7                  |       y|t        j8                  k(  r|j;                  |       yy# t<        $ r4}	t?        j@                  d|tC        jD                  |	             Y d}	~	yd}	~	ww xY w)	z
    Parse command line arguments, exit with usage() on error.
    Invoke different methods according to different command
    Nr   r   )rA   T)r   FzFailed to run '{0}': {1})#lenr   argv
parse_argsr   r/   r"   r1   r   usager,   r!   r9   r)   r   r*   r4   r$   r-   r   r+   r    r.   r   r0   r   r2   r   r3   r   r[   rC   r_   r   format_exception)
argscommandr   rg   r   rA   log_collector_full_moder   agentrj   s
             r7   mainr      s   
 |
4yA~xx|aklpaq^GUGUN4KM^-'''		M&&	&eg	M''	'^,	7'.AE-777!!%!6M555!!%!7M333!M999&&(M000M888%%e,M444((*M555""#:;M777$$%67 8 	7LL4 !22157 7	7sH   3G: &G: :#G: #G: #G: &$G: #G: /$G: $G: :	H7*H22H7c                 ^
   t         j                  }d}d}d}d}d}dddd}d}| D ]  }	|	dk(  r
t        j                  d|	      }
|
|
j	                  d      }t
        j                  j                  |      rSt        dj                  |      t        j                  	       t        t                      t        j                  d       t        j                  d
|	      rt         j                  }t        j                  |j                  t         j                        |	      rt         j                  }t        j                  |j                  t         j                         |	      rt         j                   }Wt        j                  |j                  t         j"                        |	      rt         j"                  }t        j                  |j                  t         j$                        |	      rt         j$                  }t        j                  |j                  t         j&                        |	      rt         j&                  }&t        j                  |j                  t         j(                        |	      rt         j(                  }kt        j                  |j                  d      |	      rd}t        j                  |j                  d      |	      rd}t        j                  |j                  d      |	      rd}t        j                  |j                  t         j*                        |	      rt         j*                  }+t        j                  d|	      rt         j                  }St        j                  |j                  t         j,                        |	      rt         j,                  }t        j                  |j                  d      |	      rd}t        j                  |j                  t         j.                        |	      rt         j.                  }t        j                  |j                  d      |	      r9t        j                  |j                  d      |	      j	                  d      |d<   dt        j                  |j                  d      |	      r9t        j                  |j                  d      |	      j	                  d      |d<   t        j                  |j                  d      |	      rd|d<   t         j                  } n |||||||fS )z&
    Parse command line arguments
    FN )r   r   r   z^([-/]*){0}z*^(?:[-/]*)configuration-path:([\w/\.\-_]+)r   z,Error: Configuration file {0} does not exist)filez^([-/]*)deprovision\+userrg   Tr   r   z^([-/]*)(help|usage|\?)fullzdst_ip=(?P<dst_ip>[\d.]{7,})r   zuid=(?P<uid>[\d]+)r   z	(w|wait)$z-wr   )r   r1   rematchgrouprY   r<   existsr   r\   r   stderrr   r   r)   r*   r+   r,   r-   r.   r/   r0   r2   r3   )sys_argscmdr   rg   r   rA   r   r   regex_cmd_formatargms              r7   r   r   '  s    

CEGEN# % 3"9HHBCHyWWQZN77>>.1DKK&(.1jj:egXX2C8//CXX&--m.G.GH#N++CXX&--m.B.BCSI&&CXX&--m.A.ABCH%%CXX&--m.K.KLcR//CXX&--m.J.JKSQ..CXX&--m.C.CDcJ''CXX&--i8#>GXX&--g6<EXX&--g6<EXX&--m.F.FGM**CXX0#6$$CXX&--m.G.GH#N++CXX&--f5s;&*#XX&--m.I.IJCP--CXX&--.MNPST*,((3C3J3JKj3kmp*q*w*w+h'XX&--.CDcJ')xx0@0G0GH]0^`c'd'j'jkp'qe$XX&--k:C@(,f%$$Cg3j w~7NPaaar6   c                      t        dj                  t        t        t                     t        dj                  t
        t        t                     t        dj                  t                     y)z
    Show agent version
    z{0} running on {1} {2}zPython: {0}.{1}.{2}zGoal state agent: {0}N)	r   r\   r   r   r   r   r   r   r   r5   r6   r7   r"   r"   q  s[     
#**+=+6+9; = 


&
&'7'7'79 : 

!
(
()A
BCr6   c                  ^    d} | dj                  t        j                  d         z  } | dz  } | S )z$
    Return agent usage message
    
a  usage: {0} [-verbose] [-force] [-help] -configuration-path:<path to configuration file>-deprovision[+user]|-register-service|-version|-daemon|-start|-run-exthandlers|-show-configuration|-collect-logs [-full]|-setup-firewall [-dst_ip=<IP> -uid=<UID> [-w/--wait]]r   )r\   r   r   )ss    r7   r   r   ~  s<     
A  vchhqk"	#A
 IAHr6   c                     t         j                  d   dg}|  |j                  dj                  |              t	        t
        j                  d      5 }t        j                  |||       ddd       y# 1 sw Y   yxY w)z[
    Start agent daemon in a background process and set stdout/stderr to
    /dev/null
    r   z-daemonNrq   w)stdoutr   )	r   r   appendr\   openrY   devnull
subprocessPopen)rA   r   r   s      r7   r!   r!     sk    
 HHQK#D!-44^DE	bjj#	 ?'gg>? ? ?s   A44A=__main__r   )<r(   
__future__r   rY   r   r   r   ru   azurelinuxagent.commonr   r    azurelinuxagent.common.cgroupapir   azurelinuxagent.common.confcommonrK   azurelinuxagent.common.eventrS   azurelinuxagent.common.loggerrC   azurelinuxagent.common.futurer   #azurelinuxagent.common.logcollectorr   r	   azurelinuxagent.common.osutilr
   azurelinuxagent.common.utilsr   r   -azurelinuxagent.common.utils.flexible_versionr   (azurelinuxagent.common.utils.networkutilr   azurelinuxagent.common.versionr   r   r   r   r   r   r   r   r   r   r   azurelinuxagent.ga.collect_logsr   r   $azurelinuxagent.pa.provision.defaultr   objectr   r9   r   r   r"   r   r!   r%   r5   r6   r7   <module>r      s   ( & 	 	  
  C > * * , , . . . V 4 ; I E+ + + +
 b AF $sF sl(7VGbT
D
? zF r6   