
    QKf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d dlZd dlmZ 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mZmZmZmZmZ d dlZd dlZ ej8                           G d	 d
e      Z G d d      Zd Z d Z!d.dZ"d Z#d/dZ$d Z%d Z&d Z'd Z(d Z)d Z* G d de      Z+d.dZ,d.dZ-d Z.d Z/d Z0d Z1d.d Z2d! Z3d.d"Z4d.d#Z5d$ Z6d% Z7d& Z8d' Z9d( Z:d) Z;d* Z<e=d+k(  r e6dd,d-       yy)0    N)copy)gettext)ngettext)ceil)S_IMODES_IXUSRST_MODE)urlsplit)ProxyHandlerRequestbuild_openerinstall_openerurlopenc                   $    e Zd ZdZddZd Zd Zy)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                     || _         y N)info)selfr   s     3/usr/lib/python3/dist-packages/DistUpgrade/utils.py__init__zExecutionTime.__init__<   s	    	    c                 6    t        j                          | _        y r   )timenowr   s    r   	__enter__zExecutionTime.__enter__?   s    99;r   c                 v    t        | j                  dt        j                         | j                  z
         y )Nz: )printr   r   r   )r   typevaluestacks       r   __exit__zExecutionTime.__exit__B   s"    $))TYY[488%;<=r   N) )__name__
__module____qualname____doc__r   r   r#    r   r   r   r   4   s    >r   r   c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	SoftwarePropertiesPager                     N)
r%   r&   r'   ubuntu_softwareother_softwareupdatesauthenticationadditional_driversdeveloper_options
ubuntu_pror)   r   r   r+   r+   F   s'    ONGNJr   r+   c                 4   t        |       }t        |j                        }|j                  r+|j                  j	                  |j                  d      |_        |j
                  r+|j                  j	                  |j
                  d      |_        t        |      S )Nzhidden-uzhidden-p)r   r
   uriusernamereplacepasswordstr)entrytmp	url_partss      r   )get_string_with_no_auth_from_source_entryrB   P   sl    
u+C!I''//)"4"4jA''//)"4"4jAs8Or   c                      d} 	 ddl }|j                         }|j                  d      } | S # t        $ r t	        j
                  d       Y | S w xY w)z)return True if Unity is currently runningFr   Nzcom.canonical.Unityz&could not check for Unity dbus service)dbus
SessionBusname_has_owner	Exceptionlogging	exception)unity_runningrD   buss      r   is_unity_runningrL   Z   s]    MDoo**+@A   DBCDs   %+ AAc                 d   |st        j                         }|dkD  rd|z  }t        |      5 }|j                         }d d d        j	                  d      d   j                  d      d   }|| k(  ryt        |j                  d      d   j                         d         }|dkD  ry# 1 sw Y   jxY w)	Nr   z/proc/%s/stat(r-   )Tr,   F)osgetpidopenread	partition
rpartitionintsplit)processnamepid	stat_filestat_fstatcommands         r   is_child_of_process_namer^   g   s    iik
'#c)	)_ 	!;;=D	! ..%a(33C8;k!$//#&q)//1!45 ' 	! 	!s   B&&B/c                      t         j                  j                  d      rt         j                  j                  d      syt        j                  d      t        j                  d      k7  S )z&returns True if we are inside a chrootz/procz/proc/1T/z/proc/1/root)rP   pathexistsr\   r)   r   r   inside_chrootrc   w   sB     77>>'""''..*C773<277>222r   c                     d}| j                         D ]>  }t        |      |j                  d      z
  t        |      z   |kD  r|d|z   z  }||dz   z  }@ |S )zhelpers inspired after textwrap - unfortunately
    we can not use textwrap directly because it break
    packagenames with "-" in them into new lines
    r$   
 )rW   lenrfind)twidthsubsequent_indentoutss        r   wraprn      sd    
 CWWY Hsyy&#a&0584+++Cq3w Jr   c                 b    d}| j                  d      }|D ]  }t        |fi |} || dz   z  } |S )Nr$   re   )rW   rn   )rm   kwargsmsgparaspars        r   twraprt      sF    
CGGDME q4x Jr   c                  <   g } t         j                  j                  d      sg S t        j                  dgt        j
                  d      }|j                         d   j                  d      }|d= |D ]'  }|s| j                  |j                         d          ) | S )z;return list of loaded modules (or [] if lsmod is not found)z/sbin/lsmodTstdoutuniversal_newlinesr   re   )	rP   ra   rb   
subprocessPopenPIPEcommunicaterW   append)modulesplineslines       r   lsmodr      s    G77>>-(		
D	A MMOA$$T*Ea ,NN4::<?+, Nr   c                     t         j                  j                  |       syt        t        j                  |       t
                 }|t        z  t        k(  st        j                  | |t        z         yy)zAcheck if a given binary has the executable bit and if not, add itN)rP   ra   rb   r   r\   r	   r   chmod)ra   modes     r   check_and_fix_xbitr      sO    77>>$2774=)*DG^'
tg~& (r   c                  .   ddi} dt         j                  vryt         j                  d   j                         }|dd | v r| |dd    S d|v rC|j                  d      d   j                  d      d	   }d
|v r|j                  d
      d   }|dz   S |dd dz   S )z8helper to get the country mirror from the current localecr$   LANGNr0   _.r   r,   @r-   )rP   environlowerrW   )lang_mirrorlangcountrys      r   country_mirrorr      s     )KRZZ::f##%DBQx;48$$
d{**S/!$**3/2'>mmC(+G}BQx#~r   c                      t         j                  j                  d      } | rt        j                  d| z         | S t        j                         }|j                  dd      S )z0return the codename of the current runing distroMETA_RELEASE_FAKE_CODENAMEzQusing fake release name '%s' (because of META_RELEASE_FAKE_CODENAME environment) VERSION_CODENAMEunknown distributionrP   r   getrH   warningplatformfreedesktop_os_release)dist
os_releases     r   get_distr      s[     ::>>67D79=>	
 002J>>,.DEEr   c                      t         j                  j                  d      } | rt        j                  d| z         | S t        j                         }|j                  dd      S )z0return the version of the current running distroMETA_RELEASE_FAKE_VERSIONzSusing fake release version '%s' (because of META_RELEASE_FAKE_VERSION environment) 
VERSION_IDr   r   )descr   s     r   get_dist_versionr      sZ     ::>>56D68<=	
 002J>>,(>??r   c                       e Zd Zd Zy)HeadRequestc                      y)NHEADr)   r   s    r   
get_methodzHeadRequest.get_method   s    r   N)r%   r&   r'   r   r)   r   r   r   r      s    r   r   c                    |sd   |d| z         t        |       \  }}}}} |d|d|d|d|d|d       |d	v r6	 t        t        |             }|j                          |j                  d
k(  ryy|dk(  rddl}		 |	j                  |      }
|
j                          |
j                  t        j                  j                  |             |
j                  t        j                  j                  |            }|
j                          |r |d|z         |dk7  ry	 yy# t
        $ r} |d|z         Y d}~yd}~ww xY w# t
        $ r}|r |d|z         Y d}~yd}~ww xY w)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                      y)NTr)   )xs    r   <lambda>z"url_downloadable.<locals>.<lambda>   s    r   zurl_downloadable: %szs='z' n='z' p='z' q='z' f='')httphttps   TFzerror from httplib: '%s'Nftpr   zftplib.size() returned: %szerror from ftplib: '%s')r
   r   r   closecoderG   ftplibFTPlogincwdrP   ra   dirnamesizebasenamequit)r:   
debug_funcschemenetlocra   querryfragment	http_fileer   fr   s               r   url_downloadabler      sS    %+,/7},VVT6864	3 ""	C 01IOO~~$ 
5	

6"AGGIEE"''//$'(66"''**401DFFH7$>?qy  )  	1A56	   	4q89	s0   3D! >BE !	D?*D::D?	E"EE"c                    d}i }t         j                  j                  d      dk7  r#t         j                  j                  d      |d<   nt        j                  j                  |      ryt        j                         }t        j                  ||       |j                  dd      }|r;|j                  d      }t        |j                  d            }|r|rd	|d
|d|d<   t         j                  j                  d      dk7  r#t         j                  j                  d      |d<   nd|v r|d   |d<   |r|j                         D ]8  }t        j                  d|      rt        d|z  t        j                           y t#        |      }t%        |      }	t'        |	       d|v rt        j(                  d|d          d|v rt        j(                  d|d          |S )zinit 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://:r`   zAcquire::https::Proxyr   zhttps?://\w+zproxy '%s' looks invalid)fileN
http_proxyhttps_proxy)apt_pkgconfigfindrP   ra   rb   Configurationread_config_filefind_br>   find_ivaluesrematchr   sysstderrr   r   r   putenv)
	gsettingsSYNAPTIC_CONF_FILEproxiescnf	use_proxy
proxy_host
proxy_portproxyproxy_supportopeners
             r   
init_proxyr     s    9G~~12b8!..--.DE	*	+##%  &89JJ3U;	"78JSZZ(ABCJj5?"L~~23r9">>../FG	7	"6?^^% 	E88OU3058szzJ	 %W-m,vWIIlGFO4gIImWW%56Nr   c                     	 ddl } | j                  | j                  j                        }	 |j                  dd      }| j	                  |d      }|j                  dd      S # | j                  j                  $ rR}d}|j                  |k7  r |j                  dd	      }| j	                  |d      }|j                  dd
      cY d}~S d}~ww xY w# t        $ r Y yw xY 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)
rD   BusTYPE_SYSTEM
get_object	InterfaceGet
exceptionsDBusException_dbus_error_namerG   )rD   rK   devobjdevr   error_unknowns         r   r   r   E  s    hhtxx++,	L^^(*CF ..)JKC773[AA,, 		LGM!!]2^^12F ..)JKC77<lKK		L   s;   )C 5A" "C;ACCC CC 	CCc                  &   	 ddl m} m} | j                  | j                  j
                        }|j                  dddd|j                  dd      d	dd
d	d	
      \  }}| j                  |j                         |d            }|S # t        $ r Y yw xY 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_fdsrG   )r   r   
connectionvarfdlist	inhibitors         r   inhibit_sleepr  e  s    
+%%ckk&8&89
 <<$%,LL %
V( ''6+;+;+=c!f+E'F	 s   BB 	BBc                 6    | dk(  s| j                         dk(  ryy)N0FALSEFT)upper)r>   s    r   str_to_boolr	    s    
czSYY[G+r   c                      dd l } 	 t        j                         \  }}|S # t        $ r  | j                  d       Y y w xY w)Nr   zgedefaultlocale() failed)rH   localegetdefaultlocalerG   rI   )rH   locale_sencodings      r   get_langr    sE    %6688 45s    ==c                 D    t        |       }|j                  dd      d   S )z4try to guess the flavor based on the running desktopcache-r,   r   )get_ubuntu_flavor_packagerW   )r  pkgs     r   get_ubuntu_flavorr    s$    
 $%
0C99S!Qr   c                  B    ddl m}   | d      }|j                  dd      S )Nr   )DistUpgradeConfigz"/usr/share/ubuntu-release-upgraderDistroMetaPkgs)#DistUpgrade.DistUpgradeConfigParserr  getlist)r  parsers     r   _load_meta_pkg_listr    s$     FCDF>>(J//r   c                 
   dg}	 |j                  t        t                            | t        j                         } |D ]   }|| v r| |   nd}|s|j                  s|c S  y# t        $ r}t	        d|       Y d}~Vd}~ww xY w)z@try to guess the flavor metapackage based on the running desktopzubuntu-desktopz%Could not load list of meta packages:N)extendsortedr  rG   r   aptCacheis_installed)r  	meta_pkgsr   meta_pkg	cache_pkgs        r   r  r    s    
 ""I: 3 567 }		 '/5'8E(Od	//O   :5q99:s   "A# #	B,A==Bc                     t        |       }ddi}||v r||   S |j                  d      rt        |j                  dd      d         S |j                  d      rt        |j                  dd      d         S y)	z9try to guess the flavor name based on the running desktopr  zubuntustudio-desktopzUbuntu Studioz-desktopr,   r   z-netbookUbuntu)r  endswithcapitalize_first_wordrsplit)r  r  lookups      r   get_ubuntu_flavor_namer.    sx    
#%
0C$o6F
f}c{	j	!$SZZ
A%>q%ABB	j	!$SZZ
A%>q%ABBr   c                    dd l }|j                  dd       ddlm}m} |j                  | |j                  j                  |j                  j                  |j                  j                        }|j                  d|d|       |j                          |j                         j                  |j                   j"                         |j%                  d       |j'                          |j)                          y	)
Nr   Gtkz3.0)Gdkr0  )parentflagsr    buttonsz<big><b>z</b></big>

r$   F)girequire_versionr   r1  r0  MessageDialogDialogFlagsMODALMessageTypeERRORButtonsTypeCLOSE
set_markuprealize
get_windowset_functions
WMFunctionMOVE	set_titlerundestroy)r2  summarymessager5  r1  r0  ds          r   errorrJ    s    ue$&oo##__""%%	 	 	A LL'BCIIKLLN  !4!45KKOEEGIIKr   c                     | dk  r2t        t        | t        d      z              }t        dd|      d|iz  S t	        j
                  t        d      | dz  dz        S )zG
    Convert a given size in bytes to a nicer better readable unit
    i@B i  z%(size).0f kBr   z%.1f MBg     @@)rV   r   floatr   r  format_stringr   )bytes
size_in_kbs     r   humanize_sizerP    si    
 { eeDk123
*EJI
 
 	

 ##AiL%&.62IJJr   c                  @    t         j                  j                  d      S )NzAPT::Architecture)r   r   r   r)   r   r   get_archrR    s    >>233r   c                 <   d}d}d}t        d      5 }|j                         D ]b  }|j                         }|s|j                         }||   }||k7  r1||   j                  d      d   }t	        |d      }	|	| k(  sZ ddd       y 	 ddd       y	# 1 sw Y   y	xY w)
z>check if the current system is listening on the given tcp portr,   r.   0Az/proc/net/tcpr      NTF)rR   	readlinesstriprW   rV   )
portINDEX_LOCAL_ADDRINDEX_STATESTATE_LISTENINGnet_tcpr   r   statelocal_port_str
local_ports
             r   is_port_already_listeningr`    s     KO	o	 '%%' 	D::<D ZZ\F;'E'#$45;;C@CN^R0JT! 	  !  s   A*B=BBBc                  
   d} t        j                         dk7  rt        d      t         j                  j	                  d      syt        j                  ddgt
        j                  d	      j                         d   }|| k(  ryy)
z!Return True if iptables is activezChain 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-nLTrv   )	rP   getuidOSErrorra   rb   ry   rz   r{   r|   )iptables_emptyrl   s     r   iptables_activerf    sw    N 
yy{a=>>77>>*+


	UJOOkmAC nr   c                     t        |       dkD  r?| d   j                         r,| d   j                         s| d   j                         | dd z   S | S )z-this uppercases the first word's first letterr,   r   N)rg   isalphaisupper
capitalize)strings    r   r+  r+  1  sN    
6{Q6!9,,.vay7H7H7Jay##%qr
22Mr   c                 F    t        | j                  dd      }t        |      S )zSthis takes a package synopsis and uppercases the first word's
    first letter
    rG  r$   )getattr	candidater+  )r  names     r   get_package_labelrp  8  s!     3==)R0D &&r   __main__barbazr   )F   r$   )>r  rH   rP   r   r   ry   r   r   r   r   r   r   mathr   r\   r   r   r	   urllib.parser
   urllib.requestr   r   r   r   r   r"  r   init_configobjectr   r+   rB   rL   r^   rc   rn   rt   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r.  rJ  rP  rR  r`  rf  r+  rp  r%   r)   r   r   <module>rz     s&  0   	  	  
       * * !       >F >$ 
 3
&',F@' 
+\)X@#L 0**K$480' z
 
$u r   