U
    ‹oë_ìG  ã                	   @   s„   d dl Z d dlZd dlZd dlZd dlZd dlZej ej ej 	ej 
e¡¡¡¡ d dlZejdk rrd dlmZ G dd„ dƒZdS )é    N©é   r   )ÚStringIOc                   @   sL  e Zd Zdd„ Zdd„ Zdd„ ZdRdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ ZdSd;d<„ZdTd>d?„Z d@dA„ Z!dBdC„ Z"dDdE„ Z#dFdG„ Z$dHdI„ Z%dUdJdK„Z&dLdM„ Z'dNdO„ Z(dPdQ„ Z)d:S )VÚDiskc                 C   sž   t  ¡ | _|  ¡ | _d | j  dddgi¡d  d¡d d… ¡| _| j  dddgi¡d | _t	| j d¡ƒdk r~|  jd7  _d	| _
d
g| _i | _|  ¡  d S )NÚ.ÚargsZsw_versz-productVersionr   é   r   z.0z10.13.6Úefi)ÚrunÚRunÚrÚget_diskutilÚdiskutilÚjoinÚsplitÚ
os_versionÚfull_os_versionÚlenÚsudo_mount_versionÚsudo_mount_typesÚapfsÚ_update_disks©Úself© r   ú=C:\Users\steff\Desktop\Mac OS\gibMacOS-master\Scripts\disk.pyÚ__init__   s    

$ÿzDisk.__init__c                 C   s:   t jdk rt|tƒs(t jdkr2t|tƒr2| d¡S t|ƒS )Nr   úutf-8)ÚsysÚversion_infoÚ
isinstanceÚunicodeÚbytesÚencodeÚstr)r   Úvalr   r   r   Ú_get_str   s    (
zDisk._get_strc              
      s¾   i }zŠt jdkr"t | d¡¡}njddlm} t ¡ ‰ ‡ fdd„}|ˆ _|ƒ }ˆ j	|_
ˆ j|_ˆ j|_t|tƒrz| d¡}| |d¡ ˆ j}W n* tk
r¸ } zt|ƒ W 5 d }~X Y nX |S )Nr   r   r   )ÚParserCreatec                     s*   ˆ   ¡ } t| tƒr|  d¡} ˆ  | ¡ d S )Nr   )ZgetDatar    r!   r#   Z	addObject)Úd©Zpar   r   Ú
end_string/   s    

z#Disk._get_plist.<locals>.end_stringé   )r   r   ÚplistlibÚloadsr#   Zxml.parsers.expatr'   ZPlistParserr*   ZhandleBeginElementZStartElementHandlerZhandleEndElementZEndElementHandlerZ
handleDataZCharacterDataHandlerr    r!   ZParseÚrootÚ	ExceptionÚprint)r   ÚsÚpr'   r*   ÚparserÚer   r)   r   Ú
_get_plist    s(    



zDisk._get_plistéÿÿÿÿc           	         s@  t ˆ ƒtk	rdnˆ ‰ t|ƒ}t|ƒ}| d¡}| d¡}t|ƒt|ƒk rr| ‡ fdd„tt|ƒt|ƒ ƒD ƒ¡ n8t|ƒt|ƒk rª| ‡ fdd„tt|ƒt|ƒ ƒD ƒ¡ tt|ƒƒD ]„}d dd„ || D ƒ¡}d d	d„ || D ƒ¡}t|ƒsöˆ n|}t|ƒsˆ n|}t|ƒt|ƒk r$ d
S t|ƒt|ƒkr¶ dS q¶d S )Nr6   r   c                    s   g | ]}t ˆ ƒ‘qS r   ©r$   ©Ú.0Úx©Úpadr   r   Ú
<listcomp>Z   s     z*Disk._compare_versions.<locals>.<listcomp>c                    s   g | ]}t ˆ ƒ‘qS r   r7   r8   r;   r   r   r=   \   s     Ú c                 s   s   | ]}|  ¡ r|V  qd S ©N©Úisdigit©r9   Úcr   r   r   Ú	<genexpr>a   s      z)Disk._compare_versions.<locals>.<genexpr>c                 s   s   | ]}|  ¡ r|V  qd S r?   r@   rB   r   r   r   rD   b   s      TF)ÚtypeÚintr$   r   r   ÚextendÚranger   )	r   Zvers1Zvers2r<   Zv1_partsZv2_partsÚiZv1Zv2r   r;   r   Ú_compare_versionsD   s&    


*(zDisk._compare_versionsc                 C   s   |   ¡  d S r?   )r   r   r   r   r   Úupdaten   s    zDisk.updatec                 C   s8   |   ¡ | _|  ¡ | _|  d| j¡r.|  ¡ | _ni | _d S )Nz10.12)Ú	get_disksÚdisksÚget_disk_textÚ	disk_textrJ   r   Úget_apfsr   r   r   r   r   r   q   s
    

zDisk._update_disksc                 C   s,   | j  dddgi¡d  d¡d  d¡d S )Nr   Zwhichr   r   Ú
ú©r   r
   r   r   r   r   r   r   y   s    zDisk.get_diskutilc                 C   s&   | j  d| jddgi¡d }|  |¡S )Nr   Úlistú-plistr   )r   r
   r   r5   )r   Ú	disk_listr   r   r   rL   }   s    zDisk.get_disksc                 C   s   | j  d| jdgi¡d S )Nr   rT   r   )r   r
   r   r   r   r   r   rN   ‚   s    zDisk.get_disk_textc                 C   s:   |   |¡}|sd S | j d| jdd|gi¡d }|  |¡S )Nr   ÚinforU   r   )Úget_identifierr   r
   r   r5   )r   ÚdiskÚdisk_idrV   r   r   r   Úget_disk_info†   s
    
zDisk.get_disk_infoc                 C   s$   |   |¡}|sd S |  |¡ dd ¡S )NZFilesystemName©rX   r[   Úget©r   rY   rZ   r   r   r   Úget_disk_fs   s    
zDisk.get_disk_fsc                 C   s$   |   |¡}|sd S |  |¡ dd ¡S )NZFilesystemTyper\   r^   r   r   r   Úget_disk_fs_type“   s    
zDisk.get_disk_fs_typec                 C   s`   | j  d| j d ddœ¡}|d dks,i S |d }| d¡}t|ƒdkrVd|d	  }|  |¡S )
Nz	echo y | z apfs list -plistT)r   Úshellr   r   z<?xmlr+   r6   )r   r
   r   r   r   r5   )r   ÚoutputrV   Zp_listr   r   r   rP   ™   s    
zDisk.get_apfsc                 C   s„   |   |¡}|sd S | j dg ¡D ]^}d|kr.q | dd¡ ¡ | ¡ krL dS | dg ¡D ]$}| dd¡ ¡ | ¡ krX  dS qXq dS )NÚAllDisksAndPartitionsÚAPFSVolumesÚDeviceIdentifierr>   TF©rX   rM   r]   Úlower)r   rY   rZ   r(   Úar   r   r   Úis_apfs¦   s    
zDisk.is_apfsc                 C   sp   |   |¡}|sd S | j dg ¡D ]J}| dg ¡D ]8}| ¡ | dd¡ ¡ kr0| dd¡ ¡ dk    S q0q dS )Nrc   Ú
Partitionsre   r>   ÚContentZ
apple_apfsFrf   ©r   rY   rZ   r(   r2   r   r   r   Úis_apfs_containerµ   s    
 zDisk.is_apfs_containerc                 C   sp   |   |¡}|sd S | j dg ¡D ]J}| dg ¡D ]8}| ¡ | dd¡ ¡ kr0| dd¡ ¡ dk    S q0q dS )Nrc   rj   re   r>   rk   Zapple_corestorageFrf   rl   r   r   r   Úis_cs_containerÂ   s    
 zDisk.is_cs_containerc                 C   s&   |   |¡}|sd S |  |d¡r"dS dS )NúLogical Volume on TF)rX   Ú_get_physical_diskr^   r   r   r   Úis_core_storageÏ   s    
zDisk.is_core_storagec                    s  |rt ˆ |¡ƒsd S ˆ |¡ ¡ }| d¡r@|t dƒd … }n| d¡rZ|t dƒd … }|ˆj dg ¡krp|S ˆj dg ¡D ]€}| dg ¡D ]0‰ |‡ ‡fdd„dD ƒkrŽˆ  d	d ¡    S qŽ| d
g ¡D ]0‰ |‡ ‡fdd„dD ƒkrÌˆ  d	d ¡    S qÌq~d S )Nz/dev/rú/dev/ÚAllDisksrc   rd   c                    s"   g | ]}ˆ  ˆ  |d ¡¡ ¡ ‘qS ©r>   ©r&   r]   rg   r8   ©rh   r   r   r   r=   æ   s     z'Disk.get_identifier.<locals>.<listcomp>)re   Ú
VolumeNameÚ
VolumeUUIDÚDiskUUIDÚ
MountPointre   rj   c                    s"   g | ]}ˆ  ˆ  |d ¡¡ ¡ ‘qS rt   ru   r8   rv   r   r   r=   é   s     )r   r&   rg   Ú
startswithrM   r]   )r   rY   r(   r   rv   r   rX   ×   s"    

zDisk.get_identifierc                 C   s0   |   |¡}|sd S | dd¡ d¡d  dd¡S )NrY   Zdidkr1   r   )rX   Úreplacer   r^   r   r   r   Úget_top_identifierî   s    
zDisk.get_top_identifierc                 C   sÎ   |   |¡}d| }d}d}| j d¡D ]H}| ¡  |¡r>d}q&|sDq&| ¡  d¡rV qp| ¡ | ¡ kr&|} qpq&t|ƒs|d S d | ¡  |¡dd … ¡ d¡}t|ƒsªd S |D ]}	|  |	¡}
|
r®|	  S q®d S )	Nrr   Fr>   rQ   Tz	/dev/diskr+   z ,)	r}   rO   r   rg   r{   r   r   ÚstripÚget_efi)r   rY   Zsearch_termZour_diskZour_termZ
found_diskZour_textÚlineZ
our_storesZstorer	   r   r   r   rp   ô   s2    
"

zDisk._get_physical_diskc                 C   s,   |   |¡}|sd S |  |¡s d S |  |d¡S )NzPhysical Store )rX   ri   rp   r^   r   r   r   Úget_physical_store  s    

zDisk.get_physical_storec                 C   s,   |   |¡}|sd S |  |¡s d S |  |d¡S )Nro   )rX   rq   rp   r^   r   r   r   Úget_core_storage_pv  s    

zDisk.get_core_storage_pvc                 C   s8  |   |¡}|  |¡r |  |¡}n|  |¡r4|  |¡}|s<d S |  |¡r¾| j dg ¡D ]f}| dd¡ ¡ | ¡ kr||d   S | dg ¡D ]0}| dd¡ ¡ | ¡ krˆ| dd ¡    S qˆqTnv| j dg ¡D ]f}| dd¡ ¡ | ¡ krô|d   S | dg ¡D ]0}| dd¡ ¡ | ¡ kr |d     S q qÌd S )NZ
ContainersZContainerReferencer>   ZVolumesre   rc   rj   )	rX   ri   r   rq   r‚   r   r]   rg   rM   )r   rY   rZ   rh   Úvr(   r2   r   r   r   Ú
get_parent$  s*    




zDisk.get_parentc                 C   s~   |   |  |¡¡}|sd S | jd D ]V}| dd¡ ¡ | ¡ kr"| dg ¡D ],}| dd¡ ¡ dkrJ| dd ¡    S qJq"d S )Nrc   re   r>   rj   rk   r	   )r„   rX   rM   r]   rg   rl   r   r   r   r   B  s    zDisk.get_efic                 C   sd   |   |¡}|sd S d}|  | j| j¡s>|  |¡ ¡ | jkr>d}| j | j	d|g|dœ¡}|  
¡  |S )NFTÚmount)r   Úsudo)rX   rJ   r   r   Úget_contentrg   r   r   r
   r   r   )r   rY   rZ   r†   Úoutr   r   r   Úmount_partitionO  s    
$zDisk.mount_partitionc                 C   s6   |   |¡}|sd S | j d| jd|gi¡}|  ¡  |S )Nr   Zunmount)rX   r   r
   r   r   )r   rY   rZ   rˆ   r   r   r   Úunmount_partitionZ  s    
zDisk.unmount_partitionc                 C   s,   |   |¡}|sd S |  |¡}|d ko*t|ƒS r?   )rX   Úget_mount_pointr   )r   rY   rZ   Úmr   r   r   Ú
is_mountedb  s
    

zDisk.is_mountedc                 C   s   | j  dg ¡S )NZVolumesFromDisks)rM   r]   r   r   r   r   Úget_volumesi  s    zDisk.get_volumesNc                 C   s   |   |||d¡S )NT©Ú
_get_value)r   rY   ÚfieldÚdefaultr   r   r   Ú_get_value_apfsm  s    zDisk._get_value_apfsFc                 C   sÔ   |   |¡}|sd S | j dg ¡D ]®}| dg ¡D ]0}| dd¡ ¡ | ¡ kr0| ||¡    S q0|rhq | dd¡ ¡ | ¡ kr| ||¡  S | dg ¡D ]0}| dd¡ ¡ | ¡ krœ| ||¡    S qœq d S )Nrc   rd   re   r>   rj   rf   )r   rY   r‘   r’   Z	apfs_onlyrZ   r(   rh   r   r   r   r   p  s    
zDisk._get_valuec                 C   s   |   |d¡S )Nrk   r   ©r   rY   r   r   r   r‡   „  s    zDisk.get_contentc                 C   s   |   |d¡S )Nrw   r   r”   r   r   r   Úget_volume_name‡  s    zDisk.get_volume_namec                 C   s   |   |d¡S )Nrx   r   r”   r   r   r   Úget_volume_uuidŠ  s    zDisk.get_volume_uuidc                 C   s   |   |d¡S )Nry   r   r”   r   r   r   Úget_disk_uuid  s    zDisk.get_disk_uuidc                 C   s   |   |d¡S )Nrz   r   r”   r   r   r   r‹     s    zDisk.get_mount_pointc                 C   sD   |   |¡}|sd S |  |¡}|s$d S | j dd|gi¡}|d dkS )Nr   Úopenr   r   )rX   r‹   r   r
   )r   rY   Z
new_windowrZ   r…   rˆ   r   r   r   Úopen_mount_point“  s    

zDisk.open_mount_pointc                 C   s2   | j  ddddgi¡d  d¡}dd„ |D ƒ}|S )	Nr   Zlsz-1ú/Volumesr   rQ   c                 S   s   g | ]}|d kr|‘qS rt   r   r8   r   r   r   r=      s      z,Disk.get_mounted_volumes.<locals>.<listcomp>rS   )r   Úvol_listr   r   r   Úget_mounted_volumes  s     zDisk.get_mounted_volumesc              
   C   sz   g }|   ¡ D ]h}|  tj d|¡¡}|d krF|  d¡}|  |¡|ksFq| |  |¡||  |¡|  |¡|  	|¡dœ¡ q|S )Nrš   ú/©ÚnameZ
identifierZmount_pointZ	disk_uuidZvolume_uuid)
rœ   rX   ÚosÚpathr   r•   Úappendr‹   r—   r–   )r   r›   rƒ   rI   r   r   r   Úget_mounted_volume_dicts£  s    
û
zDisk.get_mounted_volume_dictsc              
   C   s¦   i }| j  dg ¡D ]Ž}|  |¡}|  |¡}||kr>|  |¡s>q|  |¡rJq|  |¡rVq||krjdg i||< || d  |  |¡||  	|¡|  
|¡|  |¡dœ¡ q|S )Nrs   Z
partitionsrž   )rM   r]   r„   r}   rq   rm   rn   r¢   r•   r‹   r—   r–   )r   rM   r(   ÚparentZtop_diskr   r   r   Úget_disks_and_partitions_dict¶  s(    	



û
z"Disk.get_disks_and_partitions_dict)r6   )N)NF)F)*Ú__name__Ú
__module__Ú__qualname__r   r&   r5   rJ   rK   r   r   rL   rN   r[   r_   r`   rP   ri   rm   rn   rq   rX   r}   rp   r   r‚   r„   r   r‰   rŠ   r   rŽ   r“   r   r‡   r•   r–   r—   r‹   r™   rœ   r£   r¥   r   r   r   r   r   	   sN   $
*		



r   )Ú
subprocessr,   r   r    ÚtimeZjsonr¡   r¢   ÚabspathÚdirnameÚrealpathÚ__file__r
   r   r   r   r   r   r   r   Ú<module>   s
   0$
