
    p
fa                         d dl Z d dlZd dlZd dlmc mc mZ d dlmc mc mZ d dl	mc mc m
Z
 d dlmc mZ d dlmZ d dlmZ d dlmZ  G d de      Zy)    N)OSUtilError)DefaultOSUtil)ustrc                       e Zd Z fdZed        Zd Zd Zd!dZd Z	d"dZ
d Zd	 Zd
 Zed        Ze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Zd!dZd Zd Zd Zd Z ed        Z!d Z"ed         Z# xZ$S )$FreeBSDOSUtilc                 F    t         t        |           d| _        d| _        y )NFT)superr   __init___scsi_disks_timeout_setjit_enabled)self	__class__s    G/usr/lib/python3/dist-packages/azurelinuxagent/common/osutil/freebsd.pyr
   zFreeBSDOSUtil.__init__!   s     mT+-',$    c                       y)Nz/usr/local/sbin r   r   r   get_agent_bin_pathz FreeBSDOSUtil.get_agent_bin_path&   s     r   c                     d}t        j                  |      j                  d      }t        j                  |d|       t        j
                  |dj                  |             | j                  d|gd       y )Nz/etc/rc.conf
hostnameF	log_error)fileutil	read_filesplittextutilset_ini_config
write_filejoin_run_command_without_raising)r   r   rc_file_path	conf_files       r   set_hostnamezFreeBSDOSUtil.set_hostname*   se    %&&|4::4@		:x@L$))I*>?)):x*@E)Rr   c                 0    t        j                  dd      S )Nzservice sshd restartFchk_err)	shellutilrunr   s    r   restart_ssh_servicez!FreeBSDOSUtil.restart_ssh_service1   s    }}3UCCr   c                     | j                  |      }|t        j                  d|       y|	dd|d|dg}ndd|dg}||j                  d|g       | j	                  |dj                  |      	       y)
z5
        Create user account with 'username'
        Nz%User {0} already exists, skip useraddpwuseraddz-ez-mz-cz!Failed to create user account:{0})err_msg)get_userentryloggerwarnextend _run_command_raising_OSUtilErrorformat)r   username
expirationcomment	userentrycmds         r   r-   zFreeBSDOSUtil.useradd4   s     &&x0	 KK?J!HdJECHd3CJJg'--c;^;e;efn;o-pr   c                     | j                  |      rt        j                  d|       | j                  ddg       | j                  dd|g       | j	                  |d       y )Nz){0} is a system user. Will not delete it.touchz/var/run/utx.activermuserz-yT)remove)is_sys_userr0   errorr    conf_sudoer)r   r5   s     r   del_accountzFreeBSDOSUtil.del_accountE   s[    H%LLDhO))74I*JK))8T8*DE$/r   c                     | j                  |      rt        dj                  |            t        j                  |||      }| j                  dd|ddg|dj                  |             y )Nz1User {0} is a system user, will not set password.r,   usermodz-H0zFailed to set password for {0})	cmd_inputr.   )r>   r   r4   r   gen_password_hashr3   )r   r5   passwordcrypt_idsalt_lenpasswd_hashs         r   chpasswdzFreeBSDOSUtil.chpasswdL   sv    H%  89?9IK K008XN--tY$PS.T`k6V6]6]^f6g 	. 	ir   c                 H    t        j                  d      }|rt        d      y )Nzpw usermod root -h -zCFailed to delete root password: Failed to update password database.)r'   r(   r   )r   errs     r   del_root_passwordzFreeBSDOSUtil.del_root_passwordT   s%    mm23cdd r   c                 z    | j                         }|d   |k(  r#|d   j                  dd      j                         S y )Nr      : )_get_net_inforeplaceupper)r   ifnamedatas      r   
get_if_maczFreeBSDOSUtil.get_if_macY   s=    !!#7f7??3+1133r   c                 (    | j                         d d S )NrP   )rS   r)   s    r   get_first_ifzFreeBSDOSUtil.get_first_if_   s    !!#BQ''r   c                  F  	
 d } d 	d 	fd
	fdd 
fd}dg}	  |        }t        |      d	kD  rg }d
|d	   vr|j                  d
       d|d	   vr|j                  d       d|d	   vr|j                  d       d|d	   vr|j                  d       |rt        dj                  |            |D ]  }	  ||      }|j                  |        |S # t        $ r Y ,w xY w# t        $ r*}t        j                  dt        |             Y d}~|S d}~ww xY w)ay  
        Return a list of strings comprising the route table as in the Linux /proc/net/route format. The input taken is from FreeBSDs
        `netstat -rn -f inet` command. Here is what the function does in detail:

        1. Runs `netstat -rn -f inet` which outputs a column formatted list of ipv4 routes in priority order like so:

            > Routing tables
            > 
            > Internet:
            > Destination        Gateway            Flags    Refs      Use  Netif Expire
            > default            61.221.xx.yy       UGS         0      247    em1
            > 10                 10.10.110.5        UGS         0       50    em0
            > 10.10.110/26       link#1             UC          0        0    em0
            > 10.10.110.5        00:1b:0d:e6:58:40  UHLW        2        0    em0   1145
            > 61.221.xx.yy/29    link#2             UC          0        0    em1
            > 61.221.xx.yy       00:1b:0d:e6:57:c0  UHLW        2        0    em1   1055
            > 61.221.xx/24       link#2             UC          0        0    em1
            > 127.0.0.1          127.0.0.1          UH          0        0    lo0
        
        2. Convert it to an array of lines that resemble an equivalent /proc/net/route content on a Linux system like so:

            > Iface   Destination Gateway     Flags   RefCnt  Use Metric  Mask        MTU Window  IRTT
            > gre828  00000000    00000000    0001    0   0   0   000000F8    0   0   0
            > ens160  00000000    FE04700A    0003    0   0   100 00000000    0   0   0
            > gre828  00000008    00000000    0001    0   0   0   000000FE    0   0   0
            > ens160  0004700A    00000000    0001    0   0   100 00FFFFFF    0   0   0
            > gre828  2504700A    00000000    0005    0   0   0   FFFFFFFF    0   0   0
            > gre828  3704700A    00000000    0005    0   0   0   FFFFFFFF    0   0   0
            > gre828  4104700A    00000000    0005    0   0   0   FFFFFFFF    0   0   0

        :return: Entries in the ipv4 route priority list from `netstat -rn -f inet` in the linux `/proc/net/route` style
        :rtype: list(str)
        c                     g d} t        j                  | d      }|j                  d      }t        |      dk  rt	        d      |D cg c]  }|s|j                          }}d|vrt	        d      |j                  d      d	z   }|d	z   }t        ||d
 D cg c]  }t        |       c}      }||d
 D cg c]  }|j                  |       }}||   j                         }t        |      }	i }
t        d|	d	z
        D ]<  }||   j                  ||         ||   j                  ||d	z            d	z
  f|
||   <   > ||   j                  ||	d	z
           d
f|
||	d	z
     <   g }t        |      }t        d|      D ]I  }i }|
D ]'  }||   |
|   d   |
|   d	    j                         ||<   ) ||z
  |d<   |j                  |       K |S c c}w c c}w c c}w )a  
            Runs `netstat -rn -f inet` and parses its output and returns a list of routes where the key is the column name
            and the value is the value in the column, stripped of leading and trailing whitespace.

            :return: List of dictionaries representing routes in the ipv4 route priority list from `netstat -rn -f inet`
            :rtype: list(dict)
            )netstatz-rnz-finetTr   r      z.`netstat -rn -f inet` output seems to be emptyz	Internet:z<`netstat -rn -f inet` output seems to contain no ipv4 routes   Nr   Metric)r'   run_commandr   lenr   stripindexmaxljustrangeappend)r9   outputoutput_lineslineroute_header_lineroute_start_lineroute_line_lengthnetstat_route_list_route_headersn_route_headersroute_columnsinetstat_routesn_netstat_routesnetstat_routecolumns                   r   _get_netstat_rn_ipv4_routeszCFreeBSDOSUtil.read_route_table.<locals>._get_netstat_rn_ipv4_routes   sU    3C**3$?F!<<-L< 1$!"RSS5AJTTDJJLJLJ,.!"`aa , 2 2; ?! C014 #<HYHZ;[$\4SY$\ ]LXYiYjLk!lD$**->"?!l!l)*;<BBDN!.1OM1o12  !2399.:KL!"34::>!a%;PQTUU4nQ/0 ./55n_WXEX6YZBM.1)<=>
  N"#561./ 5 "+ gF,>q,A,9&,A!,D]SYEZ[\E]-__d_d_f "&)g +;Q*>h'%%m45 "!A K %]!ls   
GGG:Gc                     dt        t        j                  t        j                  dt        j
                  dt        j                  t        j                  |             d               d      z  S )a  
            Converts an IPv4 32bit address from its ASCII notation (ie. 127.0.0.1) to an 8 digit padded hex notation
            (ie. "0100007F") string.

            :return: 8 character long hex string representation of the IP
            :rtype: string
            z%08X!I=Ir      )	intbinasciihexlifystructpackunpacksocket	inet_ptonAF_INET)ipv4_ascii_addresss    r   _ipv4_ascii_address_to_hexzBFreeBSDOSUtil.read_route_table.<locals>._ipv4_ascii_address_to_hex   s]     C 0 0D&--f6F6Fv~~Wi6j"klm"no!qrtv v vr   c                     dj                  t        j                  dt        j                  ddd| z
  z  dz              d         j	                         S )a$  
            Converts an subnet mask from its CIDR integer notation (ie. 32) to an 8 digit padded hex notation
            (ie. "FFFFFFFF") string representing its bitmask form.

            :return: 8 character long hex string representation of the IP
            :rtype: string
            z{0:08x}r|   r{   l        r   )r4   r   r   r   rU   )ipv4_cidr_masks    r   _ipv4_cidr_mask_to_hexz>FreeBSDOSUtil.read_route_table.<locals>._ipv4_cidr_mask_to_hex   sQ     ##dFKKzb>FY7Z^h6h$ijklmoototovwr   c                     d}d}| dk7  r:| dk(  rd}n2| j                  d      }t        |      dkD  rt        |d         }|d   } |      } |      }||fS )	a  
            Converts an destination address from its CIDR notation (ie. 127.0.0.1/32 or default or localhost) to an 8
            digit padded hex notation (ie. "0100007F" or "00000000" or "0100007F") string and its subnet bitmask
            also in hex (FFFFFFFF).

            :return: tuple of 8 character long hex string representation of the IP and 8 character long hex string representation of the subnet mask
            :rtype: tuple(string, int)
            z0.0.0.0r   default	localhostz	127.0.0.1/r`   r   )r   rc   r~   )destinationdestination_ipdestination_subnetmaskhex_destination_iphex_destination_subnetmaskr   r   s        r   _ipv4_cidr_destination_to_hexzEFreeBSDOSUtil.read_route_table.<locals>._ipv4_cidr_destination_to_hex   s     'N%'"i'+-%0N%0%6%6s%;N>*Q.14^A5F1G.%3A%6N!;N!K)?@V)W&%'AAAr   c                 H    	  |       S # t         j                  $ r Y yw xY w)z
            If the gateway is an IPv4 address, return its IP in hex, else, return "00000000"

            :return: 8 character long hex string representation of the IP of the gateway
            :rtype: string
            00000000)r   r?   )gatewayr   s    r   _try_ipv4_gateway_to_hexz@FreeBSDOSUtil.read_route_table.<locals>._try_ipv4_gateway_to_hex   s)    "1'::<< "!"s    !!c                 b    d}d}d}d}d}d| v r||z  }d| v r||z  }d| v r||z  }d	| vr||z  }|S )
z
            Converts route flags to a bitmask of their equivalent linux/route.h values.

            :return: integer representation of a 16 bit mask
            :rtype: int
            r   r`   rP      r}   UGHSr   )ascii_route_flagsbitmask_flagsRTF_UPRTF_GATEWAYRTF_HOSTRTF_DYNAMICs         r   _ascii_route_flags_to_bitmaskzEFreeBSDOSUtil.read_route_table.<locals>._ascii_route_flags_to_bitmask   so     MF KH K''''','')++,  r   c                     | d   } | d         \  }} | d         } | d         }d}d}| d   }d}	d}
d}dj                  |||||||||	|
|      S )a  
            Converts a single FreeBSD `netstat -rn -f inet` route to its equivalent /proc/net/route line. ie:
            > default            0.0.0.0       UGS         0      247    em1
            to
            > em1  00000000    00000000    0003    0   0   0   FFFFFFFF    0   0   0

            :return: string representation of the equivalent /proc/net/route line
            :rtype: string
            NetifDestinationGatewayFlagsr   ra   z,{0}	{1}	{2}	{3}	{4}	{5}	{6}	{7}	{8}	{9}	{10})r4   )rw   network_interfacer   r   hex_gatewayr   dummy_refcount	dummy_useroute_metric	dummy_mtudummy_window
dummy_irttr   r   r   s               r   1_freebsd_netstat_rn_route_to_linux_proc_net_routezYFreeBSDOSUtil.read_route_table.<locals>._freebsd_netstat_rn_route_to_linux_proc_net_route  s     !.g 6=Z[hiv[w=x: :2=3KLK9-:PQMNI(2LILJKRR!"* r   zFIface	Destination	Gateway	Flags	RefCnt	Use	Metric	Mask	MTU	Window	IRTTr   r   r   r   r   zz`netstat -rn -f inet` output is missing columns required to convert to the Linux /proc/net/route format; columns are [{0}]zCannot read route table [{0}]N)rc   ri   KeyErrorr4   	Exceptionr0   r?   r   )ry   r   linux_style_route_fileru   missing_headersrw   linux_style_routeer   r   r   r   r   s           @@@@@r   read_route_tablezFreeBSDOSUtil.read_route_tableb   sl   H-	"^
	v		w	B.
	"	!, 	D #u!u	C8:N >"Q&"$."33#**73 q(99#**=9N1$55#**95."33#**73"" U  \  \+-. . &4 !M!,]^k,l).556GH! &% % ! !  	CLL8$q'BB%%	Cs<   BC- CC- 	C*'C- )C**C- -	D 6DD c                     g }t        |       }|dk  rt        j                  d       |S |dk(  rt        j                  d       |S t        j                  |       }|S )z
        Construct a list of all network routes known to this system.

        :param list(str) route_table: List of text entries from route table, including headers
        :return: a list of network routes
        :rtype: list(RouteEntry)
        r`   z&netstat -rn -f inet is missing headersz&netstat -rn -f inet contains no routes)rc   r0   r?   r   _build_route_list)route_table
route_listcounts      r   get_list_of_routesz FreeBSDOSUtil.get_list_of_routesG  se     
K 19LLAB
 	 aZLLAB  '88EJr   c                    ddd}| j                   st        j                  d       | j                         }fd}t	        t        || j                  |                  }t        |      dkD  rd }t        ||      }|j                  }|Ad	}| j                   s1t        j                  d
       t        j                  d       d| _         |S t        j                  dj                  |             d| _         |S )a  
        Get the name of the primary interface, which is the one with the
        default route attached to it; if there are multiple default routes,
        the primary has the lowest Metric.
        :return: the interface which has the default route
        rP   r   Nz3Examine `netstat -rn -f inet` for primary interfacec                 D    | j                   k(  xr | j                  z  S N)r   flags)routeDEFAULT_DESTr   s    r   
is_defaultz7FreeBSDOSUtil.get_primary_interface.<locals>.is_defaultl  s"    %%5VK%++<UVr   r   c                 ,    t        | j                        S r   )r~   metric)r   s    r   
get_metricz7FreeBSDOSUtil.get_primary_interface.<locals>.get_metricr  s    5<<((r   )keyrR   zGCould not determine primary interface, please ensure routes are correctz1Primary interface examination will retry silentlyTzPrimary interface is [{0}]F)disable_route_warningr0   infor   listfilterr   rc   min	interfacer1   r4   )	r   primary_interfacer   r   
candidatesr   primary_router   r   s	          @@r   get_primary_interfacez#FreeBSDOSUtil.get_primary_interface[  s     ! ))KKMN++-	W &T-D-D[-QRS
z?Q)  

;M - 7 7$ "-- ? @OP-1* !  KK4;;<MNO).D&  r   c                 (    | j                         |k(  S )z
        Indicate whether the specified interface is the primary.
        :param ifname: the name of the interface - eth0, lo, etc.
        :return: True if this interface binds the default route
        )r   r   rV   s     r   is_primary_interfacez"FreeBSDOSUtil.is_primary_interface  s     ))+v55r   c                 $    |j                  d      S )z=
        Determine if a named interface is loopback.
        lo)
startswithr   s     r   is_loopbackzFreeBSDOSUtil.is_loopback  s       &&r   c                 V    dj                  |||      }t        j                  |d      S )Nzroute add {0} {1} {2}Fr%   )r4   r'   r(   )r   netmaskr   r9   s        r   	route_addzFreeBSDOSUtil.route_add  s'    %,,S'4@}}S%00r   c                     d}d}| j                         }| j                  |      }|D ]#  }|j                  |k(  s||j                  z  s# y y)z
        For FreeBSD, the default broadcast goes to current default gw, not a all-ones broadcast address, need to
        specify the route manually to get it work in a VNET environment.
        SEE ALSO: man ip(4) IP_ONESBCAST,
        rP   r   FT)r   r   r   r   )r   r   r   r   routesr   s         r   is_missing_default_routez&FreeBSDOSUtil.is_missing_default_route  s\     !++-((5 	E!!\1ekk8Q	 r   c                      y)NTr   r)   s    r   is_dhcp_enabledzFreeBSDOSUtil.is_dhcp_enabled  s    r   c                 l    t        j                  dj                  | j                               d       y )Nz/etc/rc.d/dhclient start {0}Fr%   )r'   r(   r4   get_if_namer)   s    r   start_dhcp_servicez FreeBSDOSUtil.start_dhcp_service  s&    4;;D<L<L<NOY^_r   c                      y r   r   r)   s    r   allow_dhcp_broadcastz"FreeBSDOSUtil.allow_dhcp_broadcast  s    r   c                 N    t        j                  dj                  |      d      S )Nz$route add 255.255.255.255 -iface {0}Fr%   r'   r(   r4   r   s     r   set_route_for_dhcp_broadcastz*FreeBSDOSUtil.set_route_for_dhcp_broadcast  s     }}CJJ6R\abbr   c                 P    t        j                  dj                  |      d       y )Nz'route delete 255.255.255.255 -iface {0}Fr%   r   r   s     r   remove_route_for_dhcp_broadcastz-FreeBSDOSUtil.remove_route_for_dhcp_broadcast  s    ?FFvNX]^r   c                 (    | j                  g d      S )N)pgrepz-ndhclient)_get_dhcp_pidr)   s    r   get_dhcp_pidzFreeBSDOSUtil.get_dhcp_pid  s    !!"=>>r   c                     | j                         }t        j                  dj                  |            }|r |dk7  rt	        dj                  |            y y )Nzcdcontrol -f {0} ejectr   zFailed to eject dvd: ret={0})get_dvd_devicer'   r(   r4   r   )r   r&   dvdretcodes       r   	eject_dvdzFreeBSDOSUtil.eject_dvd  sQ    !!#-- 8 ? ? DEw!|<CCGLMM $7r   c                 P    t        j                  dj                  |      d       y )Nz/etc/rc.d/dhclient restart {0}Fr%   r   )r   rV   retrieswaits       r   
restart_ifzFreeBSDOSUtil.restart_if  s    6==fEuUr   c                     d}t        j                  |      \  }}|rt        dj                  |            	 t	        |      dz  dz  S # t
        $ r t        dj                  |            w xY w)Nz#sysctl hw.physmem |awk '{print $2}'Failed to get total memory: {0}i   )r'   run_get_outputr   r4   r~   
ValueError)r   r9   retrj   s       r   get_total_memzFreeBSDOSUtil.get_total_mem  sw    3..s3V?FFvNOO	Pv;%,, 	P?FFvNOO	Ps   A	 	$A-c                     t        j                  d      \  }}|rt        d      	 t        |      S # t        $ r t        dj                  |            w xY w)Nz sysctl hw.ncpu |awk '{print $2}'zFailed to get processor cores.r  )r'   r  r   r~   r  r4   )r   r  rj   s      r   get_processor_coresz!FreeBSDOSUtil.get_processor_cores  s^    ../QRV>??	Pv; 	P?FFvNOO	Ps	   
2 $Ac                     | j                   ry t        j                  dj                  |            \  }}|rt	        dj                  |            d| _         y )Nz&sysctl kern.cam.da.default_timeout={0}z"Failed set SCSI disks timeout: {0}T)r   r'   r  r4   r   )r   timeoutr  rj   s       r   set_scsi_disks_timeoutz$FreeBSDOSUtil.set_scsi_disks_timeout  sQ    ''../W/^/^_f/ghVBII&QRR'+$r   c                 T    t        j                  dj                  |      d      dk(  S )Nz	ps -p {0}Fr%   r   r   )r   pids     r   check_pid_alivezFreeBSDOSUtil.check_pid_alive  s#    }}[//4eDIIr   c                  6   d} d}d}t        j                  dd      \  }}|rt        dj                  |            |j	                         }|st        d      |d   } t        j                  d| z   d      \  }}|rt        d	j                  |             |j	                  d
      D ]R  }|j                  d      dk7  r|j	                         d   }+|j                  d      dk7  s@|j	                         d   }T t        j                  d| ||       | ||fS )z
        There is no SIOCGIFCONF
        on freeBSD - just parse ifconfig.
        Returns strings: iface, inet4_addr, and mac
        or 'None,None,None' if unable to parse.
        We will sleep and retry as the network must be up.
        rR   zifconfig -l etherFr%   zCan't find ether interface:{0}zCan't find ether interface.r   z	ifconfig z Can't get info for interface:{0}r   zinet r`   zether zInterface info: ({0},{1},{2}))r'   r  r   r4   r   findr0   verbose)ifacer^   macrM   rj   ifacesrl   s          r   rS   zFreeBSDOSUtil._get_net_info  s    ../BERV>EEfMNN;<<q	..{U/BERV@GGNOOLL& 	&Dyy!R'zz|A8$*jjl1o		&
 	6tSIdCr   c                    |dkD  ryd}|dkD  rd}|dz
  }t        j                  d      \  }}|rydt        |      z   }d	j                  ||      }	 d
j                  |      }t        j                  |      \  }}|ry|dz   }t        j                  |      \  }}	 |j	                         }dj                  |      }	t        j                  |	      \  }}|dk(  rw|j	                         }dj                  |      }
t        j                  |
      \  }}|dk(  r9|j	                         j                  d      D ]  }|j                  d      r|c S  dj                  |      }t        j                  |      \  }}|dk(  rw|j	                         }dj                  |      }
t        j                  |
      \  }}|dk(  r9|j	                         j                  d      D ]  }|j                  d      r|c S  y)z>
        Return device name attached to ide port 'n'.
        r_   Nr   r`   00000001rP   z2sysctl dev.storvsc | grep pnpinfo | grep deviceid=000z{0}-{1}z5sysctl dev.storvsc | grep pnpinfo | grep deviceid={0}z|awk -F . '{print $3}'z;camcontrol devlist -b | grep blkvsc{0} | awk '{{print $1}}'r   z[camcontrol devlist | grep {0} | awk -F \( '{{print $2}}'|sed -e 's/.*(//'| sed -e 's/).*//',passz<camcontrol devlist -b | grep storvsc{0} | awk '{{print $1}}')r'   r  r   r4   rstripr   r   )r   port_idg0rM   rj   g1g0g1cmd_search_idecmd_extract_idcmd_search_blkvsccmd_search_devpossiblecmd_search_storvscs                r   device_for_ide_portz!FreeBSDOSUtil.device_for_ide_port  s    Q;Q;BkG../cdVT']"B'	
 QWWX\]..~>V'*BB..~>V	 Y``agh../@AV!8]]_F{  C  C  DJ  KN#22>BKCax & 5 5c : (H#..v6'( \bbcij../ABV!8]]_F{  C  C  DJ  KN#22>BKCax & 5 5c : (H#..v6'( r   c                       y)Nr   r   r   r   r   get_total_cpu_ticks_since_bootz,FreeBSDOSUtil.get_total_cpu_ticks_since_boot=  s    r   )NN)   
   )T)%__name__
__module____qualname__r
   staticmethodr   r#   r*   r-   rA   rK   rN   rX   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  rS   r%  r'  __classcell__)r   s   @r   r   r      s    
 ! !SDq"0ie
( b& b&H  &'!R6'1 `c_?NVPP,J    B7r  r   r   )r   r   r   %azurelinuxagent.common.utils.fileutilcommonutilsr   &azurelinuxagent.common.utils.shellutilr'   %azurelinuxagent.common.utils.textutilr   azurelinuxagent.common.loggerr0    azurelinuxagent.common.exceptionr   %azurelinuxagent.common.osutil.defaultr   azurelinuxagent.common.futurer   r   r   r   r   <module>r8     s?   &    8 8 : : 8 8 . . 8 ? .`M `r   