o
    {fmH                     @   sB  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y}   d dlmZmZmZmZmZ d dlmZ Y nw d d	l m Z  G d
d de!Z"G dd dZ#dd Z$dd Z%dMddZ&dd Z'dNd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)Z0dMd*d+Z1d,d- Z2d.d/ Z3d0d1 Z4d2d3 Z5dMd4d5Z6d6d7 Z7dMd8d9Z8dMd:d;Z9d<d= Z:d>d? Z;d@dA Z<dBdC Z=dDdE Z>dFdG Z?dHdI Z@eAdJkre:ddKdL dS dS )O    )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                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	SoftwarePropertiesPager                     N)
r!   r"   r#   ubuntu_softwareother_softwareupdatesauthenticationadditional_driversdeveloper_options
ubuntu_pror   r   r   r   r%   Q   s    r%   c                 C   sJ   t | }t|j}|jr|j|jd|_|jr!|j|jd|_t|S )Nzhidden-uzhidden-p)r   r   uriusernamereplacepasswordstr)entrytmp	url_partsr   r   r   )get_string_with_no_auth_from_source_entry[   s   
r;   c                  C   sD   d} zddl }| }|d} W | S  ty!   td Y | S w )z+ return True if Unity is currently running Fr   Nzcom.canonical.Unityz&could not check for Unity dbus service)dbus
SessionBusname_has_owner	Exceptionlogging	exception)unity_runningr<   busr   r   r   is_unity_runninge   s   rD   c                 C   s   |st  }|dkrId| }t|}| }W d    n1 s!w   Y  |dd dd }|| kr8dS t|dd  d }|dks
dS )	Nr   z/proc/%s/stat(r'   )Tr&   F)osgetpidopenread	partition
rpartitionintsplit)processnamepid	stat_filestat_fstatcommandr   r   r   is_child_of_process_nameq   s   


rU   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)rG   pathexistsrS   r   r   r   r   inside_chroot   s   rY   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   
 )rN   lenrfind)twidthsubsequent_indentoutsr   r   r   wrap   s   rd   c                 K   s8   d}|  d}|D ]}t|fi |} || d 7 }q	|S )Nr   r[   )rN   rd   )rc   kwargsmsgparasparr   r   r   twrap   s   
ri   c                  C   sd   g } t jds
g S tjdgtjdd}| d d}|d= |D ]}|r/| | d  q"| S )z= return list of loaded modules (or [] if lsmod is not found) z/sbin/lsmodTstdoutuniversal_newlinesr   r[   )	rG   rW   rX   
subprocessPopenPIPEcommunicaterN   append)modulesplinesliner   r   r   lsmod   s   rv   c                 C   sF   t j| sdS tt | t }|t@ tks!t | |tB  dS dS )zB check if a given binary has the executable bit and if not, add itN)rG   rW   rX   r   rS   r   r   chmod)rW   moder   r   r   check_and_fix_xbit   s   ry   c                  C   s   ddi} dt jvrdS t jd  }|dd | v r"| |dd  S d|v rA|dd dd	 }d
|v r=|d
d }|d S |dd d S )z: helper to get the country mirror from the current locale cr   LANGNr*   _.r   r&   @r'   )rG   environlowerrN   )lang_mirrorlangcountryr   r   r   country_mirror   s   
r   c                  C      t jd} | rtd|   | S ddlm}m} |g d|dd}| }|dkr4t	j
d|  d	S |j  } |j  | S )
z2 return the codename of the current runing distro META_RELEASE_FAKE_CODENAMEzQusing fake release name '%s' (because of META_RELEASE_FAKE_CODENAME environment) r   rn   ro   )lsb_releasez-c-sTrj   "lsb_release returned exitcode: %i
unknown distributionrG   r   getr@   warningrm   rn   ro   waitsysstderrwriterk   readlinestripclose)distrn   ro   rs   resr   r   r   get_dist   "   

r   c                  C   r   )
z2 return the version of the current running distro META_RELEASE_FAKE_VERSIONzSusing fake release version '%s' (because of META_RELEASE_FAKE_VERSION environment) r   r   )r   z-rr   Trj   r   r   r   )descrn   ro   rs   r   r   r   r   get_dist_version   r   r   c                   @   s   e Zd Zdd ZdS )HeadRequestc                 C      dS )NHEADr   r   r   r   r   
get_method   s   zHeadRequest.get_methodN)r!   r"   r#   r   r   r   r   r   r      s    r   c              
   C   sT  |sdd  |d|   t | \}}}}}|d|||||f  |dv rSztt| }|  |jdkr7W dS W dS  tyR } z|d	|  W Y d
}~dS d
}~ww |dkrdd
l}	z1|	|}
|
  |
	t
j| |
t
j|}|
  |r|d|  |dkrW dS W dS  ty } z|r|d|  W Y d
}~dS d
}~ww 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   r   )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'Nftpr   zftplib.size() returned: %szerror from ftplib: '%s')r   r   r   r   coder?   ftplibFTPlogincwdrG   rW   dirnamesizebasenamequit)r3   
debug_funcschemenetlocrW   querryfragment	http_fileer   fr   r   r   r   url_downloadable  sP   


r   c           
      C   sB  d}i }t jddkrt jd|d< n0tj|rEt  }t || |dd}|rE|d}t	|
d}|rE|rEd	||f |d< t jd
dkrVt jd
|d< n
d|v r`|d |d< |r| D ]}td|sztd| tjd  dS qft|}t|}	t|	 d|v rtd|d  d|v rt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)fileN
http_proxyhttps_proxy)apt_pkgconfigfindrG   rW   rX   Configurationread_config_filefind_br7   find_ivaluesrematchr   r   r   r	   r   r   putenv)
	gsettingsSYNAPTIC_CONF_FILEproxiescnf	use_proxy
proxy_host
proxy_portproxyproxy_supportopenerr   r   r   
init_proxy,  s>   
r   c               
   C   s   zOddl } | | jj}z|dd}| |d}|ddW W S  | jjyO } z!d}|j|kr2 |dd	}| |d}|dd
W  Y d}~W S d}~ww  t	yY   Y dS w )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.Properties	OnBatteryz)org.freedesktop.DBus.Error.ServiceUnknownzorg.freedesktop.DeviceKit.Powerz /org/freedesktop/DeviceKit/Power
on_batteryF)
r<   BusTYPE_SYSTEM
get_object	InterfaceGet
exceptionsDBusException_dbus_error_namer?   )r<   rC   devobjdevr   error_unknownr   r   r   r   X  s.   
r   c                  C   sz   z2ddl m} m} | | jj}|dddd|ddd	dd
d	d	
\}}| j|	 |d  d}|W S  t
y<   Y dS w )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.ManagerInhibitz(ssss))zshutdown:sleepUpdateManagerzUpdating SystemblockN)fdF)gi.repositoryr   r   bus_get_syncBusTypeSYSTEMcall_with_unix_fd_list_syncVariantUnixInputStream	steal_fdsr?   )r   r   
connectionvarfdlist	inhibitorr   r   r   inhibit_sleept  s    
r   c                 C   s   | dks
|   dkrdS dS )N0FALSEFT)upper)r7   r   r   r   str_to_bool  s   r   c                  C   s:   dd l } z	t \}}|W S  ty   | d Y d S w )Nr   zgedefaultlocale() failed)r@   localegetdefaultlocaler?   rA   )r@   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-r&   r   )get_ubuntu_flavor_packagerN   )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-upgraderDistroMetaPkgs)#DistUpgrade.DistUpgradeConfigParserr  getlist)r  parserr   r   r   _load_meta_pkg_list  s   r  c              
   C   s   dg}z
| tt  W n ty$ } ztd| W Y d}~nd}~ww | du r-t } |D ]}|| v r9| | nd}|rD|jrD|  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   aptCacheis_installed)r   	meta_pkgsr   meta_pkg	cache_pkgr   r   r   r     s   
r   c                 C   sb   t | d}ddi}||v r|| S |dr t|ddd S |dr/t|ddd S dS )	z; try to guess the flavor name based on the running desktop r   zubuntustudio-desktopzUbuntu Studioz-desktopr&   r   z-netbookUbuntu)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   buttonsz<big><b>%s</b></big>

%sr   F)girequire_versionr   r  r  MessageDialogDialogFlagsMODALMessageTypeERRORButtonsTypeCLOSE
set_markuprealize
get_windowset_functions
WMFunctionMOVE	set_titlerundestroy)r  summarymessager  r  r  dr   r   r   error  s   
r1  c                 C   sH   | dk rt t| td }tdd|d|i S ttd| d 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     @@)rM   r   floatr   r   format_stringr|   )bytes
size_in_kbr   r   r   humanize_size  s   
r6  c                   C   s   t jdS )NzAPT::Architecture)r   r   r   r   r   r   r   get_arch  s   r7  c           
      C   s   d}d}d}t d?}| D ]1}| }|sq| }|| }||kr%q|| dd }t|d}	|	| kr@ W d   dS qW d   d	S 1 sLw   Y  d	S )
z@ check if the current system is listening on the given tcp port r&   r(   0Az/proc/net/tcp:   NTF)rI   	readlinesr   rN   rM   )
portINDEX_LOCAL_ADDRINDEX_STATESTATE_LISTENINGnet_tcpru   r   statelocal_port_str
local_portr   r   r   is_port_already_listening  s.   


rD  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r)d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/iptablesFiptablesz-nLTrj   )	rG   getuidOSErrorrW   rX   rm   rn   ro   rp   )iptables_emptyrb   r   r   r   iptables_active  s   	
rI  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
    r&   r   N)r]   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_label4  s   rQ  __main__barbazr   )rZ   r   )B
__future__r   r   r|   r   rS   r   r   r   mathr   r  r   init_configr   r@   r   rG   rm   r   r   urllib.requestr	   r
   r   r   r   urllib.parser   ImportErrorurllib2urlparser   objectr   r%   r;   rD   rU   rY   rd   ri   rv   ry   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r1  r6  r7  rD  rI  r  rQ  r!   r   r   r   r   <module>   sr   





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

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