o S(ev@szGddlmZedkreddlmZddlmZmZmZm Z m Z ddl m Z m Z mZmZmZmZmZmZmZmZddlmZmZmZmZWn=eyddlmZddlmZmZmZm Z m Z ddlm Z mZmZm Z mZmZmZmZmZmZmZmZmZmZYnwdd lZdd lZdd l Z dd l!Z!dd l"Z"dd l#Z#dd l$Z$dd l%Z%dd l&Z&dd l'Z'dd l(Z(dd l)m*Z*m+Z+dd l,m,Z,m-Z-m.Z.m/Z/dd l0m1Z2dd l3Z3dd l4Z4dd l5m4Z6ddl5m7Z7ddl8m8Z8d6ddZ9ddZ:ddZ;gfddZe=e_=GdddZ?Gddde Z@Gdd d e$jAjBjCZDGd!d"d"e$jAjBjEZFGd#d$d$e/ZGGd%d&d&e.ZHGd'd(d(eZIGd)d*d*e,ZJeKd+kreJZLeLMd,d-ejNdd.kreLjOPZQeQdkrre"Rd/geS eLjOTe Ue!Vd1qsejNdd2kreWejNd3 ZXeXYZZWd n 1swYeZD]Z[eLjO\e[e Ue!Vd4q e Uqe$]Z^ejNdd D]Z_e^e_j`re^e_jase^e_jbd0d5qe^e_cqe^deLjeeLjf e Uqd S)7)get_disttrusty)uic)QtQLocale QTranslator PYQT_VERSIONQTimer) QTextEdit QApplicationQDialog QMessageBoxQDialogButtonBoxQTreeWidgetItem QPushButtonQWidget QHBoxLayoutQLabel) QTextOptionQPixmapQIcon QTextCursor)r r rr rrrrrrrrrrN) run_apport apport_crash)DistUpgradeViewFuzzyTimeToStrInstallProgressAcquireProgress)get)gettext)unicode_gettext) QUrlOpenerstrictcCst|tr |d|S|S)NUTF-8) isinstancebytesdecode)serrorsr*@/usr/lib/python3/dist-packages/DistUpgrade/DistUpgradeViewKDE.pyutf8Ks  r,cCs,tj|rt||dStd|dS)Nzerror, can't find file: )ospathexistsrloadUiprint)fileparentr*r*r+r0Rs r0cCstj|r t|SdSN)r-r.r/r)r.r*r*r+ _find_pixmapYs r5cCs<tttkr t|S|D]}t|}|rt|Sq dSr4)typer intr fromThemer5)name fallbacksr.pixmapr*r*r+_icon^s   r<cCs|s ||dSdSr4) isMaximizedorigAdjustSizeselfr*r*r+ adjustSizeosrAc@s>eZdZdZdZdddZddZddZd d Zd d Z d S) _OSReleasez/etc/os-releaseTcCsHi|_d|_tj|_tj|jsdS|d|_|r"| dSdS)NFT) resultvalidrBOS_RELEASE_FILEr2r-r.isfileparseinject_lsb_compat)r@ lsb_compatr*r*r+__init__ys z_OSRelease.__init__cCsd|jd|jd<|jd|jd<|jd|jd<|jds'|jd|jd<|jd|jd <dS) NIDzDistributor ID PRETTY_NAME DescriptionVERSION_CODENAMECodenameUBUNTU_CODENAME VERSION_IDRelease)rCrr?r*r*r+rHs  z_OSRelease.inject_lsb_compatcCsBt|jd}|D]}|}|sq|j|ddq|dS)Nr=r)openr2strip parse_entrysplitclose)r@fliner*r*r+rGs  z_OSRelease.parsecCs4||}|dkrt|tr|d}||j|<dS)NID_LIKE ) parse_valuer%strrXrC)r@keyvaluer*r*r+rWs  z_OSRelease.parse_entrycCs"t|}t|dkr|dS|S)Nrr)shlexrXlen)r@ravaluesr*r*r+r^s  z_OSRelease.parse_valueN)T) __name__ __module__ __qualname__DEFAULT_OS_RELEASE_FILErErJrHrGrWr^r*r*r*r+rBus   rBc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS) DumbTerminalz A very dumb terminal cCsRt|d|||_|d|d|tj|d| dd|_ dS)z2 really dumb terminal with simple editing support MonospaceFTN) r rJinstallProgress setFontFamilysetFontPointSizesetWordWrapModerNoWrapsetUndoRedoEnabledsetOverwriteMode_block)r@rm parent_framer*r*r+rJs      zDumbTerminal.__init__cCs,t\|_|j_|jdkrdtjd<|jS) pty voodoordumbTERM)ptyfork child_pidrm master_fdr-environr?r*r*r+rzs  zDumbTerminal.forkcCsRt|jjgggd\}}}t|dkr#t|jjd}|t|t dS)Nr) selectrmr|rcr-readinsertWithTermCodesr,r processEvents)r@rlistwlistxlistr[r*r*r+update_interfaces   zDumbTerminal.update_interfacecCshd}|D](}t|dkr|||d}q|tdkr!q|tdkr(q||7}q||dS)z support basic terminal codes rjrl N)ordinsertPlainText textCursordeletePreviousCharchr)r@text display_textcr*r*r+rs      z DumbTerminal.insertWithTermCodescCs^t|jdsdS|tjkrt|jjtddS| s!dSt|jj| dS)z$ send (ascii) key events to the pty r|Nrl) hasattrrmr`r Key_Backspacer-writer|rrtoUtf8)r@evr*r*r+ keyPressEvents zDumbTerminal.keyPressEventcCs&|jrdSd|_|tjd|_dS)z: helper that ensures that the cursor is always at the end NTF)rt moveCursorrEndr?r*r*r+onCursorPositionChangeds   z$DumbTerminal.onCursorPositionChangedN) rerfrg__doc__rJrzrrrrr*r*r*r+ris ric@s0eZdZdZddZddZddZdd Zd S) KDECdromProgressAdapterz Report the cdrom add progress cCs|jj|_|jj|_||_dSr4) window_main label_statusstatusprogressbar_cache progressbarr3r@r3r*r*r+rJs   z KDECdromProgressAdapter.__init__cCs4|r|j||j|jt|jtdS)z; update is called regularly so that the gui can be redrawn N) rsetTextrsetValuerafloat totalStepsr r)r@rstepr*r*r+updates  zKDECdromProgressAdapter.updatecCdS)N)Frjr*r?r*r*r+ask_cdrom_namez&KDECdromProgressAdapter.ask_cdrom_namecCr)NFr*r?r*r*r+ change_cdromrz$KDECdromProgressAdapter.change_cdromN)rerfrgrrJrrrr*r*r*r+rs  rcs2eZdZdZddZd fdd ZddZZS) KDEOpProgressz methods on the progress bar cCs||_||_dSr4)rprogressbar_label)r@rrr*r*r+rJ s zKDEOpProgress.__init__Ncs*tt|||j|jtdSr4)superrrrrpercentr r)r@r __class__r*r+rs zKDEOpProgress.updatecC|jddSNrj)rrr?r*r*r+donezKDEOpProgress.doner4)rerfrgrrJrr __classcell__r*r*rr+r s  rc@s8eZdZdZddZddZddZdd Zd d Zd S) KDEAcquireProgressAdapterz? methods for updating the progress bar while fetching packages cCs(t||jj|_|jj|_||_dSr4)rrJrrrrprogressr3rr*r*r+rJ$s    z"KDEAcquireProgressAdapter.__init__cCs@td||f}t|jjtd|tjtj}|tjkrdSdS)Nz&Please insert '%s' into the drive '%s'z Media ChangeTF)_rquestionr3rOkCancel)r@mediumdrivemsgchanger*r*r+ media_change+s  z&KDEAcquireProgressAdapter.media_changecCs$t||jd|jdS)Nr)rstartrrrshowr?r*r*r+r2s  zKDEAcquireProgressAdapter.startcCs$|jjjd|jtddS)N zFetching is complete)r3r progress_textrrrr?r*r*r+stop8szKDEAcquireProgressAdapter.stopcCst|||j|j|jd}||jkr|j}|jdkrSt |j}t |t r1| t }|jtd||j|f|jjjdtdt|jdn|jtd||jf|jjjdtd S) z\ we don't have a mainloop in this application, we just call processEvents here and elsewhererrz!Fetching file %li of %li at %sB/szAbout %s remainingzzFetching file %li of %lirT)rpulserrr current_items total_items current_cpsapt_pkg size_to_strr%r&r'localegetpreferredencodingrrrr3rrretar r)r@owner current_itemrr*r*r+r<s      (zKDEAcquireProgressAdapter.pulseN) rerfrgrrJrrrrr*r*r*r+rs rc@sdeZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZdS)KDEInstallProgressAdapterz?methods for updating the progress bar while installing packagesc Cst|d|_|jj|_|jj|_|jj|_||_zt dd|_ Wn(t yJ}zt d|tjdkr%s
%sdialog_error.ui)rrrr dgettextrr r3rr0translate_widget_children label_errorrtextview_errorrhiderAexec_)r@pkgerrormsgsummaryrdialoguer*r*r+r|s&          zKDEInstallProgressAdapter.errorc Cs<td|t}td|}td}d||f}t|jj|_td|j|jj ||jj |jj j|jtj|sH|d}tjdrndd||g}tj|tjd d }|d d }|jj |n |jj td |j} |jt|7_| tjkrt|jddSt|jddS)z6ask question in case conffile has been changed by userz.got a conffile-prompt from dpkg for file: '%s'z/Replace the customized configuration file '%s'?ztYou will lose any changes you have made to this configuration file if you choose to replace it with a newer version.z1%s %szdialog_conffile.uiz .dpkg-distz /usr/bin/diffz-u)rrr$replacez The 'diff' command was not foundsy sn N)rdebugtimerr r3r confDialoguer0label_conffilertextview_conffilershow_difference_buttonclickedconnect showConffiler-r.r/ subprocessPopenPIPE communicater'rrAcceptedrr|) r@currentnewrprimsecmarkupcmddiffrCr*r*r+conffiles.          z"KDEInstallProgressAdapter.conffilecCsP|jjr|jj|jjtddS|jj|jjtddS)NzShow Difference >>>z<<< Hide Difference)rr isVisiblerrrrrr?r*r*r+rs   z&KDEInstallProgressAdapter.showConffilecCsft\|_|_|jdkr(dtjd<dtjvstjddkr#dtjd<dtjd<td |j|jS) rvrrwrxDEBIAN_FRONTENDkdenoninteractivenoneAPT_LISTCHANGES_FRONTENDz fork pid is: %s)ryrzr{r|r-r}rrr?r*r*r+rzs     zKDEInstallProgressAdapter.forkcCs|jdkr t|_|j|j|jt||dkr]t|_ d|_ |j |j}||j 8}t ||}d|j|}|dkrU|dkrU|j tdt|d S|j dd Sd S) zupdate progress bar and labelrg?FgY@gN@irr]N)rrrrrrrr,rVractivity_timeout_reportedrrrrr)r@rrrdeltatime_per_percentrr*r*r+ status_changes      z'KDEInstallProgressAdapter.status_changecCrr)rrr?r*r*r+ finish_updaterz'KDEInstallProgressAdapter.finish_updatec Cs~ z0t|jgggd\}}}t|dkr.t|jd}|j||jj t |ddnWn Wnt yN}zt |t d|WYd}~nd}~wwqzt|Wntyv}zt d|j|fd |_WYd}~nd}~ww|jdkr|j|jtkr|jszt d |j|jfWntyt d |jYnwd|_|jjjtt d dS) z no mainloop in this application, just call processEvents lots here it's also important to sleep for a minimum amount of time Trr~r)r)z&error reading from self.master_fd '%s'NzHgot ValueError from InstallProgress.update_interface. Line was '%s' (%s)rjz+no activity on terminal for %s seconds (%s)z&no activity on terminal for %s secondsg{Gz?)!rr|rcr-rrrr3 terminal_textrr,rr1rrrr ValueErrorrrTIMEOUT_TERMINAL_ACTIVITYrrwarningrrUnicodeEncodeErrorr konsole_framerr rsleep)r@rrrr[rr*r*r+rsJ      z*KDEInstallProgressAdapter.update_interfacecCs0 |t|jtj\}}||jkr |Sqr4)rr-waitpidr{WNOHANG)r@pidresr*r*r+ wait_childs z$KDEInstallProgressAdapter.wait_childN)rerfrgrrrJrrrrrzrrrr&r*r*r*r+rTs%  *rc@s$eZdZddZddZddZdS)UpgraderMainWindowcCst|td|dS)Nzwindow_main.ui)rrJr0r?r*r*r+rJ s zUpgraderMainWindow.__init__cCs ||_dSr4)r3)r@ parentRefr*r*r+ setParent%s zUpgraderMainWindow.setParentcCs&|j}|r |dS|dSr4)r3on_window_main_delete_eventacceptignore)r@eventrYr*r*r+ closeEvent(s   zUpgraderMainWindow.closeEventN)rerfrgrJr)r.r*r*r*r+r's r'cseZdZdZd7ddZddZd8ddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZfddZd8dd Zd8d!d"Z #d9d$d%Zd&d'Zd:d)d*Zd;d,d-Zd.d/Zd0d1Zd?t@|j!j>|_A|j!j>Bdd tC|j.|j!j>|_D|jAE|jD|jD#tFGd!|jH|jIdS)"NKDEPyQt4.moz)/usr/share/locale/ubuntu-release-upgraderzubuntu-release-upgraderzError setting locales (%s)DISPLAYzNo DISPLAY in os.environ foundrQT_PLATFORM_PLUGINTRUEKDE_FULL_SESSION5KDE_SESSION_VERSIONQT_QPA_PLATFORMTHEMEqtrz/usr/share/qt5/translationsz/usr/share/qt4/translationszsystem-software-updatez=/usr/share/icons/oxygen/48x48/apps/system-software-update.pngz5/usr/share/icons/hicolor/48x48/apps/adept_manager.pngr:FrLUbuntuKubuntuz%sz22.04iXi )JrrJ get_telemetryset_updater_typer getLoggersetLevelINFOr-r.joingetcwdr bindtextdomain textdomainrrr}r apprr6r r7loadrsysteminstallTranslatorr"setupUrlHandlesr< setWindowIconr'rr)r prev_steprrr_opCacheProgressr_acquireProgressr_cdromProgressr_installProgress_handleExceptionr excepthookrrrr showTerminalrrBrC label_titlerrrr rrkonsole_frame_layoutsetMinimumSizerir addWidgetr singleShotexitMainLoopMidFlightr) r@datadirlogdirlogger localedirr translator messageIconr9 title_stringr*r*r+rJ2s|                              zDistUpgradeViewKDE.__init__cCstd|jdS)Nr\)r1rIexitr?r*r*r+r\sz(DistUpgradeViewKDE.exitMainLoopMidFlightcCs|dkr|j}t|tst|tr.t|dkr#|tddn |t t|| dkrE| D]}| || |q8dSdS)NErrorkdelibs) rr%r rr_ windowTitlesetWindowTitler rrchildrentranslate_widgetr)r@ parentWidgetwidgetr*r*r+rs    z,DistUpgradeViewKDE.translate_widget_childrencCst|ts t|tr]t|dkr'tjdtddd}|t |ddSt|dkrDtjdtddd}|t |ddSt|dkr_|t t| dddSdSdS) Nz&CancelrfT)fallback&Closerjr&) r%rrr_rr translationrHrr!rr)r@rlrfr*r*r+rjs  " z#DistUpgradeViewKDE.translate_widgetcCst|ts t|tr dSt|||}tdd|t|||t sNdt|||}t |j }t d|| |j|j|||tddS)zCrash handler.Nz)not handled exception in KDE frontend: %s rjrr) issubclassKeyboardInterrupt SystemExit tracebackformat_exceptionrrrErrr rr0rdialog crash_detailrrArrrd)r@exctypeexcvalueexctblinestbtextrwr*r*r+rTs      z#DistUpgradeViewKDE._handleExceptioncCsX|jjr|jj|jjtdn|jj|jjtd|jdS)NzShow Terminal >>>z<<< Hide Terminal) rr rrrrrrrAr?r*r*r+rVs   zDistUpgradeViewKDE.showTerminalcC|jSr4)rQr?r*r*r+getAcquireProgressz%DistUpgradeViewKDE.getAcquireProgresscCs||j_|jSr4)rSr)r@cacher*r*r+getInstallProgresssz%DistUpgradeViewKDE.getInstallProgresscCr~r4)rPr?r*r*r+getOpCacheProgressrz%DistUpgradeViewKDE.getOpCacheProgresscCr~r4)rRr?r*r*r+getCdromProgressrz#DistUpgradeViewKDE.getCdromProgresscCs|jj|dSr4)rrr)r@rr*r*r+ update_statussz DistUpgradeViewKDE.update_statuscCs8t|jd|j}t|jd|j}||dS)N image_step%i label_step%i)getattrrrar)r@rimagelabelr*r*r+hideSteps zDistUpgradeViewKDE.hideStepcCsN|j}|r%t|jd|j}tdgdd}||dd|dSdS)Nrz dialog-cancel)z7/usr/share/icons/oxygen/16x16/actions/dialog-cancel.pngz@/usr/lib/kde4/share/icons/oxygen/16x16/actions/dialog-cancel.pngz4/usr/share/icons/crystalsvg/16x16/actions/cancel.pngr<)rOrrrar< setPixmapr;r)r@rr cancelIconr*r*r+aborts zDistUpgradeViewKDE.abortcstt||tdgdd}tdgdd}|jr/usr/lib/kde4/share/icons/oxygen/16x16/actions/arrow-right.pngz9/usr/share/icons/crystalsvg/16x16/actions/1rightarrow.pngrrrzz) rr/setStepr<rOrrrarr;rrr)r@rokIcon arrowIconrrrr*r+rs$zDistUpgradeViewKDE.setStepcCsd||f}t|j}td||||j||dkr+|j||jn|j| t dt dgdd}|j |dd||dS)Nrr Informationzdialog-information)z;/usr/share/icons/oxygen/48x48/status/dialog-information.pngzD/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-information.pngz=/usr/share/icons/crystalsvg/32x32/actions/messagebox_info.pngr<0)r rr0rrrrrrrhrr<rrr;rArr@rr extended_msgrrbr*r*r+ informations         zDistUpgradeViewKDE.informationcCsd||f}t|j}td||||j||dkr+|j||jn|jt dgdd}|j | dd| |dS)Nrrz dialog-error)z5/usr/share/icons/oxygen/48x48/status/dialog-error.pngz>/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-error.pngzA/usr/share/icons/crystalsvg/32x32/actions/messagebox_critical.pngr<rF)r rr0rrrrrrr<rrr;rArrr*r*r+r's        zDistUpgradeViewKDE.errorTcCst|||||t|j|_td|j|jj|jjj |j | |j|jj tjtd|jj tjt|jj tjtddtdgdd}|jj|dd|d kr|d d d }|jj tj||d d d } |jj tj| d|} |jj| |jj|j|jj|jjdg|jj |j!D]} |jj"d t#|jjtd| j$gq|j%D]} |jj"d t#|jjtd| j$gq|j&D]} |jj"d t#|jjtd| j$gq|j'D]} |jj"d t#|jjtd| j$gq|j(D]}|jj"d t#|jjtd|j$gq |j)|j*}|tj+krIdSdS)zshow the changes dialoguezdialog_changes.uiz&Start UpgradeDetails >>>zdialog-warning)z7/usr/share/icons/oxygen/48x48/status/dialog-warning.pngz@/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-warning.pngz@/usr/share/icons/crystalsvg/32x32/actions/messagebox_warning.pngr<rNrrrjrz%sPackageszNo longer supported %sz Remove %szRemove (was auto installed) %sz Install %sz Upgrade %sTF),rconfirmChangesr rchangesDialoguer0treeview_detailsr buttonBox helpRequestedrshowChangesDialogueDetailsrbuttonrrrrHelpsetIconrr<question_pixmaprr;rr label_summary label_changesconfirmChangesMessageclearsetHeaderLabelsheader demotionsinsertTopLevelItemrr9toRemove toRemoveAuto toInstall toUpgraderArr)r@rchangesr downloadSizeactions removal_boldrbcancelconfirm summaryTextdemotedrminstupr%r*r*r+r?sR       ( ( ( * *   z!DistUpgradeViewKDE.confirmChangescCsp|jjr|jj|jjtjt ddn|jj |jjtjdt d|j dS)Nrrz<<< ) rrrrrrrrrrrrAr?r*r*r+rws    z-DistUpgradeViewKDE.showChangesDialogueDetailsNocCs4t|j|d|tjtjBtj}|tjkrdSdS)NzTF)rrrYesr)r@rrdefaultanswerr*r*r+askYesNoQuestions" z#DistUpgradeViewKDE.askYesNoQuestionrc Csttj||tj|j}|tj}|tj}|td|dkr(| |n| ||dur=| }| |t j B|}|tjkrHdSdS)NContinuerTF)rWarningNoButtonr addButtonApplyrrrsetDefaultButton windowFlagssetWindowFlagsrFramelessWindowHintr) r@rrr messageBoxcontinueButton cancelButtonflagsrr*r*r+askCancelContinueQuestions     z,DistUpgradeViewKDE.askCancelContinueQuestioncCsxttjtdtdtj|j}|tj}|tj}|td dd|t dd| }|tjkr:dSd S) NzRestart requiredz<Restart the system to complete the upgradez _Restart NowrrorfrnTF) rQuestionrrrrrrrrr rr)r@r yesButtonnoButtonrr*r*r+confirmRestarts   z!DistUpgradeViewKDE.confirmRestartcCs tdSr4)r rr?r*r*r+rs z DistUpgradeViewKDE.processEventsFcCsdSr4r*)r@rr*r*r+ pulseProgresssz DistUpgradeViewKDE.pulseProgresscCsBtd}|dd}t|jtd|tjtj}|tjkrdSdS)NzCancel the running upgrade? The system could be in an unusable state if you cancel the upgrade. You are strongly advised to resume the upgrade.rqz
zCancel Upgrade?TF)rrrrrrr)r@rrr*r*r+r*s   z.DistUpgradeViewKDE.on_window_main_delete_event)NNr4)NT)r)r)F)rerfrgrrJr\rrjrTrVrrrrrrrrrrrrrrrrrr*rr*r*rr+r/0s6 `      8  r/__main__zinput box testzbar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar z --test-termbashTg{Gz?z--show-in-terminalg?)purge)r#)gutilsr ImportErrorPyQt5r PyQt5.QtCorerrrr r PyQt5.QtWidgetsr r r rrrrrrr PyQt5.QtGuirrrrr1 PyQt4.QtCore PyQt4.QtGuirrrrrruaptrrbr-ryDistUpgradeApportrrrrrr telemetryrr@rr DistUpgradeGettextrr!r"r,r0r5r<rAr>rBrirbase CdromProgressr OpProgressrrrr'r/reviewrargvrrzr$callrdrrr!rUrZrcharsrrCacherr is_installed is_upgradable mark_delete mark_installcommitrQrSr*r*r*r+s   0  D      4K5K