U
    ÑfÜc­G  ã                   @   s2  d dl mZ d dlmZ d dlmZ d dlmZmZmZ d dl	m
Z
 d dlZd dlZe ¡  d dlZd dlZd dlZd dlZd dlZd dlZd dlZz,d dlmZmZmZmZmZ d dlmZ W n< ek
rü   d dlmZmZmZmZmZ d dlmZ Y nX d d	l m Z  G d
d„ de!ƒZ"dd„ Z#dd„ Z$dKdd„Z%dd„ Z&dLdd„Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+d d!„ Z,d"d#„ Z-G d$d%„ d%eƒZ.dMd&d'„Z/dNd(d)„Z0d*d+„ Z1d,d-„ Z2d.d/„ Z3d0d1„ Z4dOd2d3„Z5d4d5„ Z6dPd6d7„Z7dQd8d9„Z8d:d;„ Z9d<d=„ Z:d>d?„ Z;d@dA„ Z<dBdC„ Z=dDdE„ Z>dFdG„ Z?e@dHkr.e9ddIdJƒ dS )Ré    )Úprint_function)Úgettext)Úngettext)ÚS_IMODEÚST_MODEÚS_IXUSR)ÚceilN)ÚProxyHandlerÚRequestÚbuild_openerÚinstall_openerÚurlopen)Úurlsplit)Úcopyc                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )ÚExecutionTimezº
    Helper that can be used in with statements to have a simple
    measure of the timing of a particular block of code, e.g.
    with ExecutionTime("db flush"):
        db.flush()
    Ú c                 C   s
   || _ d S ©N)Úinfo)Úselfr   © r   ú3/usr/lib/python3/dist-packages/DistUpgrade/utils.pyÚ__init__G   s    zExecutionTime.__init__c                 C   s   t   ¡ | _d S r   )ÚtimeÚnow©r   r   r   r   Ú	__enter__J   s    zExecutionTime.__enter__c                 C   s    t d| jt ¡ | j f ƒ d S )Nz%s: %s)Úprintr   r   r   )r   ÚtypeÚvalueÚstackr   r   r   Ú__exit__M   s    zExecutionTime.__exit__N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r   r   r   r   r   @   s   
r   c                 C   sJ   t | ƒ}t|jƒ}|jr*|j |jd¡|_|jrB|j |jd¡|_t|ƒS )Nzhidden-uzhidden-p)r   r   ÚuriZusernameÚreplaceZpasswordÚstr)ÚentryZtmpZ	url_partsr   r   r   Ú)get_string_with_no_auth_from_source_entryQ   s    
r)   c                  C   sF   d} zddl }| ¡ }| d¡} W n tk
r@   t d¡ Y nX | S )z+ return True if Unity is currently running Fr   Nzcom.canonical.Unityz&could not check for Unity dbus service)ÚdbusZ
SessionBusZname_has_ownerÚ	ExceptionÚloggingÚ	exception)Zunity_runningr*   Úbusr   r   r   Úis_unity_running[   s    r/   c              	   C   s|   |st  ¡ }|dkrxd| }t|ƒ}| ¡ }W 5 Q R X | d¡d  d¡d }|| kr\dS t| d¡d  ¡ d ƒ}qdS )	Nr   z/proc/%s/statú(é   ú)Té   F)ÚosÚgetpidÚopenÚreadÚ	partitionÚ
rpartitionÚintÚsplit)ZprocessnameÚpidZ	stat_fileZstat_fÚstatZcommandr   r   r   Úis_child_of_process_nameg   s    
r>   c                   C   s0   t j d¡rt j d¡sdS t  d¡t  d¡kS )z, returns True if we are inside a chroot
    z/procz/proc/1Tú/z/proc/1/root)r4   ÚpathÚexistsr=   r   r   r   r   Úinside_chrootw   s    rB   éF   r   c                 C   sL   d}|   ¡ D ]:}t|ƒ| d¡ t|ƒ |kr:|d| 7 }||d 7 }q|S )z¤ helpers inspired after textwrap - unfortunately
        we can not use textwrap directly because it break
        packagenames with "-" in them into new lines
    r   Ú
ú )r;   ÚlenÚrfind)ÚtÚwidthZsubsequent_indentÚoutÚsr   r   r   Úwrap   s    rL   c                 K   s4   d}|   d¡}|D ]}t|f|Ž} || d 7 }q|S )Nr   rD   )r;   rL   )rK   ÚkwargsÚmsgZparasZparr   r   r   ÚtwrapŽ   s    
rO   c                  C   sd   g } t j d¡sg S tjdgtjdd}| ¡ d  d¡}|d= |D ]}|rD|  | ¡ d ¡ qD| S )z= return list of loaded modules (or [] if lsmod is not found) z/sbin/lsmodT©ÚstdoutZuniversal_newlinesr   rD   )	r4   r@   rA   Ú
subprocessÚPopenÚPIPEÚcommunicater;   Úappend)ÚmodulesÚpÚlinesÚliner   r   r   Úlsmod—   s    ÿr[   c                 C   sB   t j | ¡sdS tt  | ¡t ƒ}|t@ tks>t  | |tB ¡ dS )zB check if a given binary has the executable bit and if not, add itN)r4   r@   rA   r   r=   r   r   Úchmod)r@   Úmoder   r   r   Úcheck_and_fix_xbit©   s
    r^   c                  C   s–   ddi} dt jkrdS t jd  ¡ }|dd… | krD| |dd…  S d|kr‚| d¡d  d¡d	 }d
|krz| d
¡d }|d S |dd… d S dS )z: helper to get the country mirror from the current locale Úcr   ZLANGNé   Ú_Ú.r   r3   ú@r1   )r4   ÚenvironÚlowerr;   )Zlang_mirrorZlangZcountryr   r   r   Úcountry_mirror²   s    
rf   c                  C   s†   t j d¡} | r"t d|  ¡ | S ddlm}m} |dddg|dd	}| ¡ }|dkrjt	j
 d
| ¡ dS |j ¡  ¡ } |j ¡  | S )z2 return the codename of the current runing distro ZMETA_RELEASE_FAKE_CODENAMEzQusing fake release name '%s' (because of META_RELEASE_FAKE_CODENAME environment) r   ©rS   rT   Úlsb_releasez-cú-sTrP   ú"lsb_release returned exitcode: %i
úunknown distribution©r4   rd   Úgetr,   ZwarningrR   rS   rT   ÚwaitÚsysÚstderrÚwriterQ   ÚreadlineÚstripÚclose)ZdistrS   rT   rX   Úresr   r   r   Úget_distÈ   s"    ÿÿ
rv   c                  C   s†   t j d¡} | r"t d|  ¡ | S ddlm}m} |dddg|dd	}| ¡ }|dkrjt	j
 d
| ¡ dS |j ¡  ¡ } |j ¡  | S )z2 return the version of the current running distro ZMETA_RELEASE_FAKE_VERSIONzSusing fake release version '%s' (because of META_RELEASE_FAKE_VERSION environment) r   rg   rh   z-rri   TrP   rj   rk   rl   )ZdescrS   rT   rX   ru   r   r   r   Úget_dist_versionÝ   s"    ÿÿ
rw   c                   @   s   e Zd Zdd„ ZdS )ÚHeadRequestc                 C   s   dS )NZHEADr   r   r   r   r   Ú
get_methodó   s    zHeadRequest.get_methodN)r!   r"   r#   ry   r   r   r   r   rx   ò   s   rx   c              
   C   sb  |sdd„  |d|  ƒ t | ƒ\}}}}}|d|||||f ƒ |dkrªz*tt| ƒƒ}| ¡  |jdkrnW dS W dS  tk
r¦ } z|d	| ƒ W Y ¢dS d
}~X Y nX n´|dkr^dd
l}	zd|	 |¡}
|
 ¡  |
 	t
j |¡¡ |
 t
j |¡¡}|
 ¡  |r|d| ƒ |dkrW dS W n< tk
r\ } z|rF|d| ƒ W Y ¢dS d
}~X Y nX dS )zÒ
    helper that checks if the given uri exists and is downloadable
    (supports optional debug_func function handler to support
     e.g. logging)

    Supports http (via HEAD) and ftp (via size request)
    c                 S   s   dS )NTr   )Úxr   r   r   Ú<lambda>   ó    z"url_downloadable.<locals>.<lambda>zurl_downloadable: %sz"s='%s' n='%s' p='%s' q='%s' f='%s')ÚhttpÚhttpséÈ   TFzerror from httplib: '%s'NZftpr   zftplib.size() returned: %szerror from ftplib: '%s')r   r   rx   rt   Úcoder+   ÚftplibZFTPZloginÚcwdr4   r@   ÚdirnameÚsizeÚbasenameÚquit)r%   Z
debug_funcZschemeZnetlocr@   ZquerryZfragmentZ	http_fileÚer   Úfr„   r   r   r   Úurl_downloadable÷   sF    
 ÿ




r‰   c           
      C   sH  d}i }t j d¡dkr*t j d¡|d< n`tj |¡rŠt  ¡ }t  ||¡ | dd¡}|rŠ| d¡}t	| 
d¡ƒ}|rŠ|rŠd	||f |d< t j d
¡dkr¬t j d
¡|d< nd|krÀ|d |d< |rD| ¡ D ](}t d|¡sÎtd| tjd  dS qÎt|ƒ}t|ƒ}	t|	ƒ d|kr*t d|d ¡ d|krDt d|d ¡ |S )zË init proxy settings

    * use apt.conf http proxy if present,
    * otherwise look into synaptics config file,
    * otherwise the default behavior will use http_proxy environment
      if present
    z/root/.synaptic/synaptic.confzAcquire::http::Proxyr   r}   zSynaptic::useProxyFzSynaptic::httpProxyzSynaptic::httpProxyPortzhttp://%s:%s/zAcquire::https::Proxyr~   zhttps?://\w+zproxy '%s' looks invalid)ÚfileNZ
http_proxyZhttps_proxy)Úapt_pkgÚconfigÚfindr4   r@   rA   ZConfigurationZread_config_fileZfind_br'   Zfind_iÚvaluesÚreÚmatchr   ro   rp   r	   r   r   Úputenv)
Z	gsettingsZSYNAPTIC_CONF_FILEZproxiesZcnfZ	use_proxyZ
proxy_hostZ
proxy_portÚproxyZproxy_supportZopenerr   r   r   Ú
init_proxy"  s<    


r“   c               
   C   sÀ   z¤ddl } |  | jj¡}z(| dd¡}|  |d¡}| dd¡W W S  | jjk
r  } z>d}|j|krf‚ | dd	¡}|  |d¡}| dd
¡ W Y ¢W S d}~X Y nX W n t	k
rº   Y dS X dS )z­
    Check via dbus if the system is running on battery.
    This function is using UPower per default, if UPower is not
    available it falls-back to DeviceKit.Power.
    r   Nzorg.freedesktop.UPowerz/org/freedesktop/UPowerzorg.freedesktop.DBus.PropertiesZ	OnBatteryz)org.freedesktop.DBus.Error.ServiceUnknownzorg.freedesktop.DeviceKit.Powerz /org/freedesktop/DeviceKit/PowerÚ
on_batteryF)
r*   ZBusZTYPE_SYSTEMZ
get_objectZ	InterfaceZGetÚ
exceptionsZDBusExceptionZ_dbus_error_namer+   )r*   r.   ZdevobjZdevr‡   Zerror_unknownr   r   r   r”   N  s(    ÿ
ÿ(r”   c                  C   s€   zdddl m} m} |  | jj¡}| dddd| dd¡d	dd
d	d	¡
\}}| j| 	¡ |d  d}|W S  t
k
rz   Y dS X d	S )z‚
    Send a dbus signal to logind to not suspend the system, it will be
    released when the return value drops out of scope
    r   )ÚGioÚGLibzorg.freedesktop.login1z/org/freedesktop/login1zorg.freedesktop.login1.ManagerZInhibitz(ssss))zshutdown:sleepZUpdateManagerzUpdating SystemÚblockNéÿÿÿÿ)ÚfdF)Úgi.repositoryr–   r—   Zbus_get_syncZBusTypeZSYSTEMZcall_with_unix_fd_list_syncZVariantZUnixInputStreamZ	steal_fdsr+   )r–   r—   Z
connectionÚvarZfdlistZ	inhibitorr   r   r   Úinhibit_sleepj  s*      ÿ    ùr   c                 C   s   | dks|   ¡ dkrdS dS )NÚ0ZFALSEFT)Úupper)r'   r   r   r   Ústr_to_boolƒ  s    r    c                  C   s@   dd l } zt ¡ \}}|W S  tk
r:   |  d¡ Y d S X d S )Nr   zgedefaultlocale() failed)r,   ÚlocaleZgetdefaultlocaler+   r-   )r,   Zlocale_sÚencodingr   r   r   Úget_lang‰  s    
r£   c                 C   s   t | d}| dd¡d S )z6 try to guess the flavor based on the running desktop ©Úcacheú-r3   r   )Úget_ubuntu_flavor_packager;   )r¥   Úpkgr   r   r   Úget_ubuntu_flavor“  s    
r©   c                  C   s    ddl m}  | dƒ}| dd¡S )Nr   )ÚDistUpgradeConfigz"/usr/share/ubuntu-release-upgraderZDistroZMetaPkgs)Z#DistUpgrade.DistUpgradeConfigParserrª   Zgetlist)rª   Úparserr   r   r   Ú_load_meta_pkg_listœ  s    r¬   c              
   C   sŒ   dg}z|  ttƒ ƒ¡ W n, tk
rF } ztd|ƒ W 5 d}~X Y nX | dkrXt ¡ } |D ]*}|| krp| | nd}|r\|jr\|  S q\dS )zB try to guess the flavor metapackage based on the running desktop zubuntu-desktopz%Could not load list of meta packages:N)ÚextendÚsortedr¬   r+   r   ÚaptZCacheZis_installed)r¥   Z	meta_pkgsr‡   Zmeta_pkgZ	cache_pkgr   r   r   r§   ¤  s    

r§   c                 C   sf   t | d}ddi}||kr"|| S | d¡r@t| dd¡d ƒS | d¡r^t| dd¡d ƒS dS d	S )
z; try to guess the flavor name based on the running desktop r¤   zubuntustudio-desktopzUbuntu Studioz-desktopr3   r   z-netbookZUbuntuN)r§   ÚendswithÚcapitalize_first_wordÚrsplit)r¥   r¨   Úlookupr   r   r   Úget_ubuntu_flavor_name¹  s    


r´   c                 C   sŒ   dd l }| dd¡ ddlm}m} |j| |jj|jj	|j
jd}| d||f ¡ | ¡  | ¡  |jj¡ | d¡ | ¡  | ¡  dS )	Nr   ÚGtkz3.0)rµ   ÚGdk)ÚparentÚflagsr   Zbuttonsz<big><b>%s</b></big>

%sr   F)ÚgiZrequire_versionr›   rµ   r¶   ZMessageDialogZDialogFlagsZMODALZMessageTypeZERRORZButtonsTypeZCLOSEZ
set_markupZrealizeZ
get_windowZset_functionsZ
WMFunctionZMOVEZ	set_titleÚrunZdestroy)r·   ÚsummaryÚmessager¹   rµ   r¶   Údr   r   r   ÚerrorÈ  s    ý
r¾   c                 C   sL   | dk r0t t| tdƒ ƒƒ}tdd|ƒd|i S t tdƒ| d d ¡S dS )zG
    Convert a given size in bytes to a nicer better readable unit
    i@B iè  z%(size).0f kBr„   z%.1f MBg     @@N)r:   r   Úfloatr   r¡   Úformat_stringra   )ÚbytesZ
size_in_kbr   r   r   Úhumanize_sizeÙ  s    
 ÿrÂ   c                   C   s   t j d¡S )NzAPT::Architecture)r‹   rŒ   r   r   r   r   r   Úget_archê  s    rÃ   c           
   	   C   sŽ   d}d}d}t dƒp}| ¡ D ]`}| ¡ }|s0q| ¡ }|| }||krJq||  d¡d }t|dƒ}	|	| kr W 5 Q R £ dS qW 5 Q R X dS )	z@ check if the current system is listening on the given tcp port r3   é   Z0Az/proc/net/tcpú:é   TF)r6   Ú	readlinesrs   r;   r:   )
ZportZINDEX_LOCAL_ADDRZINDEX_STATEZSTATE_LISTENINGZnet_tcprZ   rŽ   ÚstateZlocal_port_strZ
local_portr   r   r   Úis_port_already_listeningî  s"    

rÉ   c                  C   sV   d} t  ¡ dkrtdƒ‚t j d¡s(dS tjddgtjdd	 ¡ d }|| krRdS dS )
z# Return True if iptables is active zøChain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
r   z%Need root to check the iptables statez/sbin/iptablesFZiptablesz-nLTrP   )	r4   ÚgetuidÚOSErrorr@   rA   rR   rS   rT   rU   )Ziptables_emptyrJ   r   r   r   Úiptables_active
  s    	
þþrÌ   c                 C   s@   t | ƒdkr<| d  ¡ r<| d  ¡ s<| d  ¡ | dd…  S | S )z3 this uppercases the first word's first letter
    r3   r   N)rF   ÚisalphaÚisupperÚ
capitalize)Ústringr   r   r   r±   "  s    $r±   c                 C   s   t | jddƒ}t|ƒS )zX this takes a package synopsis and uppercases the first word's
        first letter
    r»   r   )ÚgetattrÚ	candidater±   )r¨   Únamer   r   r   Úget_package_label*  s    rÔ   Ú__main__ZbarZbaz)N)rC   r   )N)N)N)N)N)AZ
__future__r   r   ra   r   r=   r   r   r   Zmathr   r¯   r‹   Zinit_configr¡   r,   r   r4   rR   ro   r   Zurllib.requestr	   r
   r   r   r   Zurllib.parser   ÚImportErrorZurllib2Zurlparser   Úobjectr   r)   r/   r>   rB   rL   rO   r[   r^   rf   rv   rw   rx   r‰   r“   r”   r   r    r£   r©   r¬   r§   r´   r¾   rÂ   rÃ   rÉ   rÌ   r±   rÔ   r!   r   r   r   r   Ú<module>   sj   



		
+
,

	


