3
$\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j  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y,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 j  | _d S )N)timenow)r   r   r   r   	__enter__J   s    zExecutionTime.__enter__c             C   s    t d| jtj | 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|jd|_|jrB|j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   sT   d} yddl }|j }|jd} W n, tk
rN } ztjd W Y dd}~X 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(   buser   r   r   is_unity_running[   s    r.   c          
   C   s   |st j }xn|dkrzd| }t|}|j }W d Q R X |jdd jdd }|| kr^dS t|jdd j d }qW 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   s4   t jjd st jjd r dS t jdt jdkS )z, returns True if we are inside a chroot
    z/procz/proc/1T/z/proc/1/root)r3   pathexistsr<   r   r   r   r   inside_chrootw   s    rA   F   r   c             C   sP   d}xF| j  D ]:}t||jd t| |kr<|d| 7 }||d 7 }qW |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    rK   c             K   s8   d}| j d}x$|D ]}t|f|} || d 7 }qW |S )Nr   rC   )r:   rK   )rJ   kwargsmsgZparasZparr   r   r   twrap   s    

rN   c              C   sh   g } t jjdsg S tjdgtjdd}|j d jd}|d= x"|D ]}|rF| j|j d  qFW | S )z= return list of loaded modules (or [] if lsmod is not found) z/sbin/lsmodT)stdoutuniversal_newlinesr   rC   )	r3   r?   r@   
subprocessPopenPIPEcommunicater:   append)modulesplinesliner   r   r   lsmod   s    
rZ   c             C   sB   t jj| sdS tt j| t }|t@ tks>t j| |tB  dS )zB check if a given binary has the executable bit and if not, add itN)r3   r?   r@   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 j }|dd | krD| |dd  S d|kr|jdd jdd	 }d
|krz|j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   r2   @r0   )r3   environlowerr:   )Zlang_mirrorZlangZcountryr   r   r   country_mirror   s    
re   c              C   s   t jjd} | r"tjd|   | S ddlm}m} |dddg|dd	}|j }|dkrjt	j
jd
|  dS |jj j } |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   )rR   rS   lsb_releasez-cz-sT)rO   rP   z"lsb_release returned exitcode: %i
zunknown distribution)r3   rc   getr*   warningrQ   rR   rS   waitsysstderrwriterO   readlinestripclose)ZdistrR   rS   rW   resr   r   r   get_dist   s    
rq   c              C   s   t jjd} | r"tjd|   | S ddlm}m} |dddg|dd	}|j }|dkrjt	j
jd
|  dS |jj j } |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   )rR   rS   rf   z-rz-sT)rO   rP   z"lsb_release returned exitcode: %i
zunknown distribution)r3   rc   rg   r*   rh   rQ   rR   rS   ri   rj   rk   rl   rO   rm   rn   ro   )ZdescrR   rS   rW   rp   r   r   r   get_dist_version   s    
rr   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!   rt   r   r   r   r   rs      s   rs   c             C   sL  |sdd  |d|   t | \}}}}}|d|||||f  |dkry&tt| }|j  |jdkrldS d	S  tk
r } z|d
|  d	S d}~X nX n|dkrHddl}	yb|	j|}
|
j  |
j	t
jj| |
jt
jj|}|
j  |r|d|  |dkrdS W n4 tk
rF } z|r8|d|  d	S d}~X 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>   s    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')rw   rx   )r   r   rs   ro   coder)   ftplibZFTPZlogincwdr3   r?   dirnamesizebasenamequit)r#   Z
debug_funcschemeZnetlocr?   ZquerryZfragmentZ	http_filer-   r{   fr~   r   r   r   url_downloadable   sB    




r   c       
      C   sJ  d}i }t jjddkr*t jjd|d< n`tjj|rt j }t j|| |jdd}|r|jd}t	|j
d}|r|rd	||f |d< t jjd
dkrt jjd
|d< nd|kr|d |d< |rFx2|j D ]&}tjd|std| tjd dS qW t|}t|}	t|	 d|kr,tjd|d  d|krFtjd|d  |S )z init proxy settings

    * first check for http_proxy environment (always wins),
    * then check the apt.conf http proxy,
    * then look into synaptics conffile
    * then into gconf  (if gconfclient was supplied)
    z/root/.synaptic/synaptic.confzAcquire::http::Proxyr   rw   zSynaptic::useProxyFzSynaptic::httpProxyzSynaptic::httpProxyPortzhttp://%s:%s/zAcquire::https::Proxyrx   zhttps?://\w+zproxy '%s' looks invalid)fileNZ
http_proxyZhttps_proxy)apt_pkgconfigfindr3   r?   r@   ZConfigurationZread_config_fileZfind_br%   Zfind_ivaluesrematchr   rj   rk   r	   r   r   putenv)
Z	gsettingsZSYNAPTIC_CONF_FILEZproxiesZcnfZ	use_proxyZ
proxy_hostZ
proxy_portproxyZproxy_supportopenerr   r   r   
init_proxy"  s<    


r   c              C   s   yddl } | j| jj}y$|jdd}| j|d}|jddS  | jjk
r } z4d}|j|krb |jdd	}| j|d}|jdd
S d}~X nX W n  t	k
r } zdS d}~X n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|   ybddl m} m} | j| jj}|jdddd|jddddddd
\}}| j|j	 |d  d}|S  t
k
rv   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)shutdown:sleepUpdateManagerUpdating SystemblockNr2   )fdF)r   r   r   r   )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| j  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 } ytj \}}|S  tk
r6   | jd 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}|jddd S )z6 try to guess the flavor based on the running desktop )cache-r2   r   )get_ubuntu_flavor_packager:   )r   pkgr   r   r   get_ubuntu_flavor  s    
r   c              C   s    ddl m}  | d}|j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}y|j tt  W n, tk
rF } ztd| W Y dd}~X nX | dkrXtj } x.|D ]&}|| krr| | nd}|r^|jr^|S q^W 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 |jdr@t|jddd S |jdr^t|j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-desktopr2   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 }|jdd ddlm}m} |j| |jj|jj	|j
jd}|jd||f  |j  |j j|jj |jd |j  |j  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_titleZ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jtd| d d S dS )zG
    Convert a given size in bytes to a nicer better readable unit
    i  z%(size).0f kBr~   z%.1f MBg     @@Ni@B )r9   r   floatr   r   format_stringr`   )bytesZ
size_in_kbr   r   r   humanize_size  s
    

r   c               C   s   t j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h}x`|j D ]T}|j }|s2q |j }|| }||krLq || jdd }t|d}	|	| kr dS q W W dQ R X d	S )
z@ check if the current system is listening on the given tcp port r2      Z0Az/proc/net/tcp:   TNF)r5   	readlinesrn   r:   r9   )
ZportZINDEX_LOCAL_ADDRZINDEX_STATEZSTATE_LISTENINGZnet_tcprY   r   stateZlocal_port_strZ
local_portr   r   r   is_port_already_listening  s"    

r   c              C   sV   d} t j dkrtdt jjds(dS tjddgtjdd	j d }|| krRdS dS )
z# Return True if iptables is active zChain 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-nLT)rO   rP   )	r3   getuidOSErrorr?   r@   rQ   rR   rS   rT   )Ziptables_emptyrI   r   r   r   iptables_active
  s    
r   c             C   sB   t | dkr>| d j r>| d j  r>| d j | dd  S | S )z3 this uppercases the first word's first letter
    r2   r   N)rE   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)rB   r   )N)N)N)N)N)AZ
__future__r   r   r`   r   r<   r   r   r   Zmathr   r   r   Zinit_configr   r*   r   r3   rQ   rj   r   Zurllib.requestr	   r
   r   r   r   Zurllib.parser   ImportErrorZurllib2Zurlparser   objectr   r'   r.   r=   rA   rK   rN   rZ   r]   re   rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sj   



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

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