
    dD5                         d dl Z d dlZ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Z d dlmc mZ d dlmZ d dlmZ  ej&                  dej(                        Z G d de      Zy)    N)OSUtilError)DefaultOSUtilz5^\s*[A-F0-9]{8}(?:\-[A-F0-9]{4}){3}\-[A-F0-9]{12}\s*$c                   $    e Zd Z fdZe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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)dZd*dZ d Z!d Z"d  Z#d! Z$ed"        Z%d# Z&ed$        Z' xZ(S )+OpenBSDOSUtilc                 F    t         t        |           d| _        d| _        y )NTF)superr   __init__jit_enabled_scsi_disks_timeout_set)self	__class__s    G/usr/lib/python3/dist-packages/azurelinuxagent/common/osutil/openbsd.pyr	   zOpenBSDOSUtil.__init__)   s     mT+-',$    c                       y)Nz/usr/local/sbin r   r   r   get_agent_bin_pathz OpenBSDOSUtil.get_agent_bin_path.   s     r   c                     t        j                  d      \  }}|dk7  st        j                  |      y|j	                         S )Nzsysctl -n hw.uuidr    )	shellutilrun_get_outputUUID_PATTERNmatchstripr   retoutputs      r   get_instance_idzOpenBSDOSUtil.get_instance_id2   s=    ../BCV!8|))&19||~r   c                 x    t        j                  ddj                  |             | j                  d|gd       y )Nz/etc/mynamez{}
hostnameF)	log_error)fileutil
write_fileformat_run_command_without_raising)r   r   s     r   set_hostnamezOpenBSDOSUtil.set_hostname8   s3    M6==+BC)):x*@E)Rr   c                 0    t        j                  dd      S )Nzrcctl restart sshdFchk_errr   runr   s    r   restart_ssh_servicez!OpenBSDOSUtil.restart_ssh_service<   s    }}15AAr   c                 b    t        j                  dj                  | j                        d      S )Nzrcctl start {0}Fr'   r   r*   r#   service_namer+   s    r   start_agent_servicez!OpenBSDOSUtil.start_agent_service?   s&    }}.55d6G6GHRWXXr   c                 b    t        j                  dj                  | j                        d      S )Nzrcctl stop {0}Fr'   r.   r+   s    r   stop_agent_servicez OpenBSDOSUtil.stop_agent_serviceB   s&    }}-44T5F5FGQVWWr   c                     t        j                  dj                  | j                        d       t        j                  dj                  | j                        d      S )Nzchmod 0555 /etc/rc.d/{0}Fr'   zrcctl enable {0}r.   r+   s    r   register_agent_servicez$OpenBSDOSUtil.register_agent_serviceE   sG    0778I8IJTYZ}}/66t7H7HISXYYr   c                 b    t        j                  dj                  | j                        d      S )Nzrcctl disable {0}Fr'   r.   r+   s    r   unregister_agent_servicez&OpenBSDOSUtil.unregister_agent_serviceI   s&    }}0778I8IJTYZZr   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/utmpuserdelz-rT)remove)is_sys_userloggererrorr$   conf_sudoer)r   usernames     r   del_accountzOpenBSDOSUtil.del_accountL   sZ    H%LLDhO))7O*DE))9dH*EF$/r   c                    d}d }|st         j                  j                  |      sd}t        j                  ||       |rdj                  |      }ndj                  |      }t        j                  ||       t        j                  |d       y t         j                  j                  |      ra	 t        j                  |      }|j                  d      }|D cg c]	  }||vs| }}t        j                  |dj                  |             y y c c}w # t        $ r}t        dj                  |            d }~ww xY w)Nz/etc/doas.confzpermit keepenv nopass root
zpermit keepenv nopass {0}
zpermit keepenv persist {0}
i  
zFailed to remove sudoer: {0})ospathisfiler!   append_filer#   chmod	read_filesplitr"   joinIOErrorr   )	r   r?   nopasswdr:   	doas_confdoascontentxerrs	            r   r>   zOpenBSDOSUtil.conf_sudoerS   s   $	77>>),5$$Y54;;HE5<<XF  D1NN9e, ww~~i(9&00;G"==.D'+A!xq/@AADA''	499T?C ) B 9% ',,2F3K9 99s0   0*D 	D$D('D D 	D>D99D>c                    | j                  |      rt        dj                  |            | j                  dg|dj                  |            }|j	                         }| j                  dd||gdj                  |             y )	Nz/User {0} is a system user. Will not set passwd.encryptz"Failed to encrypt password for {0})	cmd_inputerr_msgusermodz-pzFailed to set password for {0})rU   )r;   r   r#    _run_command_raising_OSUtilErrorr   )r   r?   passwordcrypt_idsalt_lenr   passwd_hashs          r   chpasswdzOpenBSDOSUtil.chpasswdm   s    H%  67=vh7GI I66	{h?c?j?jks?t 7 vlln--y$X.V6V6]6]^f6g 	. 	ir   c                 l    t        j                  d      \  }}|rt        dj                  |            y )Nzusermod -p "*" rootz#Failed to delete root password: {0})r   r   r   r#   r   s      r   del_root_passwordzOpenBSDOSUtil.del_root_passwordw   s:    ../DEV $$*F6N4 4 r   c                 z    | j                         }|d   |k(  r#|d   j                  dd      j                         S y )Nr      :r   )_get_net_inforeplaceupper)r   ifnamedatas      r   
get_if_maczOpenBSDOSUtil.get_if_mac}   s=    !!#7f7??3+1133r   c                 (    | j                         d d S )Nr`   )rb   r+   s    r   get_first_ifzOpenBSDOSUtil.get_first_if   s    !!#BQ''r   c                 V    dj                  |||      }t        j                  |d      S )Nzroute add {0} {1} {2}Fr'   )r#   r   r*   )r   netmaskgatewaycmds        r   	route_addzOpenBSDOSUtil.route_add   s'    %,,S'4@}}S%00r   c                 >    t        j                  dd      }|dk(  ryy)Nzroute -n get defaultFr'   r   Tr)   )r   r   s     r   is_missing_default_routez&OpenBSDOSUtil.is_missing_default_route   s     mm2EB!8r   c                      y Nr   r+   s    r   is_dhcp_enabledzOpenBSDOSUtil.is_dhcp_enabled       r   c                      y rs   r   r+   s    r   start_dhcp_servicez OpenBSDOSUtil.start_dhcp_service   ru   r   c                      y rs   r   r+   s    r   stop_dhcp_servicezOpenBSDOSUtil.stop_dhcp_service   ru   r   c           	         d}dj                  | j                         d         }d}d}d}d}d}t        j                  d	j                  |             t	        j                  |      D ]y  }t        |      j                         }	||	v s"d}
d
}d}|	j                         D ]>  }|j                  |      rd}
d
}d}||v rN	 |j                  d      d   j                  d      j                  d      }dj                  d |D              }
d}n||v rpd|v rd
}y	 |j                  dd      d   j                  d      }t        j                  j                  ||      }|t        j                  j!                         kD  rd
}||v st        j                  dj                  |
||             |r|
|s|
}t        j                  dj                  |             A | |&t        j                  dj                  |             |S t        j                  d       |S # t        $ r( t        j                  dj                  |             Y w xY w# t        $ r( t        j                  dj                  |             Y w xY w)zE
        OpenBSD has a sligthly different lease file format.
        Nz/var/db/dhclient.leases.{}r   leasezoption option-245expire}z%Y/%m/%d %H:%M:%S %Zz looking for leases in path [{0}]FT ;ra   .c              3   F   K   | ]  }t        t        |d               yw)   N)strint).0ds     r   	<genexpr>z8OpenBSDOSUtil.get_dhcp_lease_endpoint.<locals>.<genexpr>   s     'HAC2J'Hs   !zcould not parse '{0}'never   z"could not parse expiry token '{0}'z%dhcp entry:{0}, 245:{1}, expired: {2}zfound endpoint [{0}]zcached endpoint found [{0}]zcached endpoint not found)r#   ri   r<   infoglobopenread
splitlines
startswithrI   r   rJ   
ValueErrorr=   datetimestrptimeutcnow)r   endpointpathglobHEADER_LEASEHEADER_OPTIONHEADER_EXPIREFOOTER_LEASEFORMAT_DATETIME
lease_fileleasescached_endpointhas_option_245expiredlineipaddrexpire_stringexpire_dates                    r   get_dhcp_lease_endpointz%OpenBSDOSUtil.get_dhcp_lease_endpoint   s    /66t7H7H7J17MN+ 06==hGH))H- &	QJ*%**,F&"&!&"--/  QD|4*.)."&&$.O%)ZZ_R%8%>%>s%C%I%I#%NF"xx'H'HH ,-1N '$."d?&+G	C04

$'1,,.1005c
 !..6.?.?.H.H$1?/D#.1B1B1I1I1K#K.3G &-$K%+VO^W%UW&?+F>'6H"KK(>(E(Eh(OPA Q&	QR KK5<<XFG  KK349  * O"LL)@)G)G)MNO $. C & .55;VD\!CCs&   AH$A'I$-II-J	J	c                      y rs   r   r+   s    r   allow_dhcp_broadcastz"OpenBSDOSUtil.allow_dhcp_broadcast   ru   r   c                 N    t        j                  dj                  |      d      S )Nz$route add 255.255.255.255 -iface {0}Fr'   r   r*   r#   r   re   s     r   set_route_for_dhcp_broadcastz*OpenBSDOSUtil.set_route_for_dhcp_broadcast   s%    }} ##)6&>5B 	Br   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-OpenBSDOSUtil.remove_route_for_dhcp_broadcast   s     "F6NE	;r   c                 (    | j                  g d      S )N)pgrepz-ndhclient)_get_dhcp_pidr+   s    r   get_dhcp_pidzOpenBSDOSUtil.get_dhcp_pid   s    !!"=>>r   c                     d}t        j                  |      D cg c]  }t        j                  ||       c}D ]&  }|dj	                  |j                  d            c S  t        d      c c}w )Nzcd[0-9]cz/dev/{0}r   zFailed to get DVD device)rC   listdirrer   r#   groupr   )r   dev_dirpatterndevdvds        r   get_dvd_devicezOpenBSDOSUtil.get_dvd_device   sg    68jj6IJsBHHWc*J 	7C!((166	7 455 Ks   A.c                 R   || j                         }|t        j                         }t        j                  j                  |      st        j                  |       t        d|      D ]  }| j                  ||g dd      }|dk(  rt        j                  d        y ||dz
  k  s?t        j                  d      d   }| j                  ||      }	|	t        j                  d||	        y t        j                  d	||       t        j                   |        |rt#        d
      y )Nr   )z-oroz-tudfF)optionr(   zSuccessfully mounted DVD   z/sbin/mountz{0} is mounted at {1}z$Mount DVD failed: retry={0}, ret={1}zFailed to mount DVD.)r   confget_dvd_mount_pointrC   rD   isdirmakedirsrangemountr<   r   r   r   get_mount_pointwarntimesleepr   )
r   	max_retryr(   
dvd_devicemount_point
sleep_timeretryretcode	mountlistexistings
             r   	mount_dvdzOpenBSDOSUtil.mount_dvd   s    ,,.J224Kww}}[)KK$1i( 	'Ejj +'@(- ! /G !|67y1}$%44]CAF	//	:F'KK 7XNBE#%

:&!	'" 455 r   c                     | j                         }t        j                  dj                  |            }|r |dk7  rt	        dj                  |            y y )Nzcdio eject {0}r   zFailed to eject DVD: ret={0})r   r   r*   r#   r   )r   r(   r   r   s       r   	eject_dvdzOpenBSDOSUtil.eject_dvd  sQ    !!#-- 0 7 7 <=w!|<CCGLMM $7r   c                 P    t        j                  dj                  |      d       y )Nz/sbin/dhclient {0}Fr'   r   )r   re   retrieswaits       r   
restart_ifzOpenBSDOSUtil.restart_if  s    *11&95Ir   c                     t        j                  d      \  }}|rt        dj                  |            	 t	        |      dz  dz  S # t
        $ r t        dj                  |            w xY w)Nzsysctl -n hw.physmemFailed to get total memory: {0}i   )r   r   r   r#   r   r   r   s      r   get_total_memzOpenBSDOSUtil.get_total_mem  ss    ../EFV?FFvNOO	Pv;t#D(( 	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 -n hw.ncpuzFailed to get processor cores.r   )r   r   r   r   r   r#   r   s      r   get_processor_coresz!OpenBSDOSUtil.get_processor_cores  s^    ../BCV>??	Pv; 	P?FFvNOO	Ps	   
2 $Ac                      y rs   r   )r   timeouts     r   set_scsi_disks_timeoutz$OpenBSDOSUtil.set_scsi_disks_timeout)  ru   r   c                 Z    |sy t        j                  dj                  |      d      dk(  S )Nz	ps -p {0}Fr'   r   r   )r   pids     r   check_pid_alivezOpenBSDOSUtil.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 OpenBSD - 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.
        r   z0ifconfig hvn | grep -E "^hvn.:" | sed "s/:.*//g"Fr'   zCan't find ether interface:{0}zCan't find ether interface.r   z	ifconfig z Can't get info for interface:{0}rB   zinet r   r   zlladdr zInterface info: ({0},{1},{2}))r   r   r   r#   rI   findr<   verbose)ifaceinetmacr   r   ifacesr   s          r   rb   zOpenBSDOSUtil._get_net_info1  s    ..>OV>EEfMNN;<<q	..%0V@GGNOOLL& 	&Dyy!R'zz|A9%+jjl1o		&
 	6tSIdCr   c                 $    dj                  |      S )z>
        Return device name attached to ide port 'n'.
        zwd{0})r#   )r   port_ids     r   device_for_ide_portz!OpenBSDOSUtil.device_for_ide_portU  s     ~~g&&r   c                       y)Nr   r   r   r   r   get_total_cpu_ticks_since_bootz,OpenBSDOSUtil.get_total_cpu_ticks_since_boot[  s    r   )FF)   
   )z/dev)r   TNN   )T)   r   ))__name__
__module____qualname__r	   staticmethodr   r   r%   r,   r0   r2   r4   r6   r@   r>   r\   r^   rg   ri   ro   rq   rt   rw   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   r   r   __classcell__)r   s   @r   r   r   '   s   -
 ! !SBYXZ[094i4(1;zB;?6 !"6BNJPPJ
 !  ! F'  r   r   )rC   r   r   r   r   %azurelinuxagent.common.utils.fileutilcommonutilsr!   &azurelinuxagent.common.utils.shellutilr   azurelinuxagent.common.loggerr<   azurelinuxagent.common.confr    azurelinuxagent.common.exceptionr   %azurelinuxagent.common.osutil.defaultr   compile
IGNORECASEr   r   r   r   r   <module>r     s\   ( 
 	    8 8 : : . . * * 8 ?rzz<MM
vM vr   