a ,ˆßi�kã@sàdZddlmZmZmZmZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZddlZddlZddlmZddlmZddlZddlmZmZddlZed ƒe  d ¡Ze  d ¡Ze  d ¡Ze  d ¡Z eZ!dZ"edƒZ#edƒZ$edƒZ%dZ&d5dd„Z'dd„Z(gfdd„Z)d6dd„Z*dd„Z+Gdd„de,ƒZ-Gd d!„d!e,ƒZ.e.ƒZ/Gd"d#„d#ej0j1ƒZ2d$d%„Z3d&d'„Z4d(d)„Z5d*d+„Z6gd,¢Z7Gd-d.„d.ej8ƒZ9Gd/d0„d0ej:j;ƒZdS)7zGsystem_upgrade.py - DNF plugin to handle major-version system upgrades.é)ÚcallÚPopenÚ check_outputÚCalledProcessErrorN)Újournal)Ú_Úlogger)ÚCliError)Úucd)Úserialize_transactionÚTransactionReplayzthe color of the skyZ 9348174c5cc74001a71ef26bd79d302eZ fef1cc509d5047268b83a3a553f54b43Z 3e0a5636d16b4ca4bbe5321d06c6aa62Z 8cec00a1566f4d3594f116450395f06cz/usr/bin/plymouthz/usr/lib/python3.9/site-packages/dnf-plugins/system_upgrade.pyrEs rc Cs d}dD]’}zvt|ƒ�Z}|D]D}| ¡}| |¡r|t|ƒd… d¡WdƒWSqWdƒn1sv0YWqty˜YqYq0qdS)NzUPGRADE_GUIDE_URL=)z/etc/os-releasez/usr/lib/os-releaseú")ÚopenÚstripÚ startswithÚlenÚIOError)ÚkeyÚpathZ release_fileÚlinerrrÚget_url_from_os_releaseOs  R  rc Csxtj |¡sdSt |¡D]X}tj ||¡}||vr6qz(tj |¡rRtj |¡n t |¡Wqt ypYq0qdS©N) rrÚisdirÚlistdirÚjoinÚdnfÚutilZrm_rfÚunlinkÚOSError)rÚignoreÚentryÚfullpathrrrÚ clear_dir^s   r+cCs6tj |j¡|jkrttƒ‚|r2||jkr2ttƒ‚dSr )r$ÚrpmÚdetect_releaseverÚ installrootÚ releaseverr ÚRELEASEVER_MSGÚCANT_RESET_RELEASEVER)ÚconfÚtargetrrrÚcheck_release_verosr4c CsRztddƒ}| d¡Wn4tyL}zttdƒ|ƒWYd}~n d}~00dS)Nz /dev/tty0Úwbs[9;0]z%Screen blanking can't be disabled: %s)rÚwriteÚ ExceptionÚprintr)ZttyÚerrrÚdisable_blankingxs  r:c@s´eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e dƒZ e dƒZ e dƒZ e dƒZ e dƒZe dƒZe dƒZe dƒZe dƒZe dƒZe dƒZe dƒZe dƒZe dƒZdS)ÚStatecCs||_i|_| ¡dSr )Ú statefileÚ_dataÚ_read)Úselfr<rrrÚ__init__„szState.__init__cCs€z:t|jƒ�}t |¡|_Wdƒn1s.0YWn@tyRi|_Yn*tyzi|_t t dƒ|j¡Yn0dS)Nz;Failed loading state file: %s, continuing with empty state.) rr<ÚjsonÚloadr=rÚ ValueErrorrÚwarningr)r?Úfprrrr>‰s .    ÿz State._readcCsZtj tj |j¡¡t|jdƒ�$}tj |j |ddd�Wdƒn1sL0YdS)NÚwéT©ÚindentZ sort_keys) r$r%Ú ensure_dirrrÚdirnamer<rrAÚdumpr=)r?Zoutfrrrr6”sz State.writecCs&tj |j¡rt |j¡| ¡dSr )rrÚexistsr<r&r>©r?rrrÚclear™s z State.clearcCs|Sr rrNrrrÚ __enter__žszState.__enter__cCs|dur| ¡dSr )r6)r?Úexc_typeÚ exc_valueÚ tracebackrrrÚ__exit__¡szState.__exit__cs"‡fdd„}‡fdd„}t||ƒS)Ncs||jˆ<dSr )r=)r?Úvalue©ÚoptionrrÚsetprop§szState._prop..setpropcs |j ˆ¡Sr )r=ÚgetrNrVrrÚgetpropªszState._prop..getprop)Úproperty)rWrXrZrrVrÚ_prop¦s  z State._propÚ state_versionÚdownload_statusÚdestdirÚtarget_releaseverÚsystem_releaseverÚgpgcheckÚgpgcheck_reposÚrepo_gpgcheck_reposÚupgrade_statusÚupgrade_commandÚ distro_syncÚpoweroff_afterÚenable_disable_reposÚmodule_platform_idN)Ú__name__Ú __module__Ú __qualname__r@r>r6rOrPrTr\r]r^r_r`rarbrcrdrerfrgrhrirjrrrrr;ƒs*  r;c@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)ÚPlymouthOutputz†A plymouth output helper class. Filters duplicate calls, and stops calling the plymouth binary if we fail to contact it. cCsd|_tƒ|_d|_dS©NT)ÚaliveÚdictÚ _last_argsÚ _last_msgrNrrrr@ËszPlymouthOutput.__init__cGsf||j |¡k}|jr|r"|dkr`ztt|f|ƒdk|_WntyTd|_Yn0||j|<|jS)Nú--pingrF)rrrYrprÚPLYMOUTHr')r?ÚcmdÚargsZdupe_cmdrrrÚ _plymouthÐs   zPlymouthOutput._plymouthcCs | d¡S)Nrt)rxrNrrrÚpingÚszPlymouthOutput.pingcCs4|jr |j|kr | dd|j¡||_| dd|¡S)Nz hide-messagez--textzdisplay-message)rsrx©r?ÚmsgrrrÚmessageÝszPlymouthOutput.messagec CsPd}z$ttdgƒ}t dt|ƒ¡r&d}Wnttfy>Yn0| dd|¡S)NZupdatesz--helpz--system-upgradeúsystem-upgradez change-modez--)rruÚreÚsearchr rr'rx)r?ÚmodeÚsrrrÚset_modeãs zPlymouthOutput.set_modecCs| ddt|ƒ¡S)Nú system-updatez --progress)rxÚstr)r?ÚpercentrrrÚprogressíszPlymouthOutput.progressN) rkrlrmÚ__doc__r@rxryr|r‚r†rrrrrnÄs  rnc@s$eZdZdd„Zdd„Zdd„ZdS)ÚPlymouthTransactionProgresscCs| ||||¡dSr )Ú_update_plymouth)r?ÚpackageÚactionZti_doneZti_totalZts_doneZts_totalrrrr†ùsz$PlymouthTransactionProgress.progresscCsd|dkr dS|tjjkr0t td||ƒ¡nt dtd||ƒ¡t | ||||¡¡dS)Nég€V@éZg$@)r$ÚcallbackZ PKG_VERIFYÚPlymouthr†Úintr|Ú _fmt_event©r?rŠr‹ÚcurrentÚtotalrrrr‰üs  z,PlymouthTransactionProgress._update_plymouthcCs tjj ||¡}d||||fS)Nz[%d/%d] %s %s...)r$Ú transactionZACTIONSrYr’rrrr‘ sz&PlymouthTransactionProgress._fmt_eventN)rkrlrmr†r‰r‘rrrrrˆösrˆccsFt ¡}|j|jdd�d}|D] }|d}||kr6q |}|Vq dS)zVFind all boots with this message id. Returns the entries of all found boots. r)Ú MESSAGE_IDZ_UIDNÚ_BOOT_ID)rÚReaderZ add_matchÚhex)Ú message_idÚjZoldbootr)ZbootrrrÚ find_bootssÿrœc Cspttdƒƒd}tttƒƒD]:\}}td |d|d|d| dd¡| d d¡¡ƒq|dkrlttd ƒƒdS) Nz3The following boots appear to contain upgrade logs:éÿÿÿÿu){} / {.hex}: {:%Y-%m-%d %H:%M:%S} {}→{}rŒr—Z__REALTIME_TIMESTAMPÚSYSTEM_RELEASEVERz??ÚTARGET_RELEASEVERz-- no logs were found --)r8rÚ enumeraterœÚID_TO_IDENTIFY_BOOTSÚformatrY)Únr)rrrÚ list_logs$s   ûr¤cCsZtt|ƒƒ}z*|dkrt‚|dkr*|d8}||dWStyTttdƒƒ‚Yn0dS)NrrŒr—z!Cannot find logs with this index.)ÚlistrœÚ IndexErrorr r)ršr£ZbootsrrrÚ pick_boot2s  r§cCsDtt|ƒ}tdd|jgƒ}| ¡|j}|dkr@tj t dƒ¡‚dS)NZ journalctlz--bootrŒz%Unable to match systemd journal entry) r§r¡rr™ÚwaitÚ returncoder$Ú exceptionsÚErrorr)r£Zboot_idZprocessÚrcrrrÚshow_logAs  r­)ZdownloadZcleanrÚupgradeÚlogcs eZdZdZ‡fdd„Z‡ZS)ÚSystemUpgradePluginr}cs8tt|ƒ ||¡|r4| t¡| t¡| t¡dSr )Úsuperr°r@Zregister_commandÚSystemUpgradeCommandÚOfflineUpgradeCommandÚOfflineDistrosyncCommand)r?ÚbaseÚcli©Ú __class__rrr@Rs   zSystemUpgradePlugin.__init__)rkrlrmÚnamer@Ú __classcell__rrr·rr°Osr°cs(eZdZdZedƒZdZ‡fdd„Zedd„ƒZ dd „Z d d „Z d d „Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Z d6d7„Z!d8d9„Z"d:d;„Z#dd?„Z%d@dA„Z&dBdC„Z'‡Z(S)Dr²)r}Úfedupz+Prepare system for upgrade to a new releasezvar/lib/dnf/system-upgradecsjtt|ƒ |¡tj |jjj|j ¡|_ tj |j d¡|_ tj |jjjd¡|_ t tj |j d¡ƒ|_dS)Nzsystem-upgrade-transaction.jsonrƒzsystem-upgrade-state.json)r±r²r@rrr#rµr2r.ÚDATADIRÚdatadirÚtransaction_fileÚ magic_symlinkr;Ústate)r?r¶r·rrr@`s zSystemUpgradeCommand.__init__cCs`|jdddtdƒd�|jdddtd ƒd�|jd d td d  t¡d�|jdttdƒd�dS)Nz--no-downgradergÚ store_falsez=keep installed packages if the new release's version is older)Údestr‹Úhelpz --poweroffrhÚ store_truez1power off system after the operation is completedÚtidrŒz[%s]ú|)ÚnargsÚchoicesÚmetavarz--numberzwhich logs to show)ÚtyperÃ)Ú add_argumentrÚCMDSr#r�)ÚparserrrrÚ set_argparserhsþþ  ÿz"SystemUpgradeCommand.set_argparsercCs(tj||tj|jj|jjtjjd�dS)zLog directly to the journal.)r–ZPRIORITYržrŸZ DNF_VERSIONN) rÚsendZ LOG_NOTICErÀrar`r$ÚconstZVERSION)r?r|ršrrrÚ log_statusvsûzSystemUpgradeCommand.log_statuscCs| d¡| d¡dS)NÚcheckÚ pre_configure©Ú _call_subrNrrrrÓs z"SystemUpgradeCommand.pre_configurecCs| d¡dS)NÚ configurerÔrNrrrrÖƒszSystemUpgradeCommand.configurecCs| d¡dS)NÚrunrÔrNrrrr׆szSystemUpgradeCommand.runcCs| d¡dS)Nr•rÔrNrrrÚrun_transaction‰sz$SystemUpgradeCommand.run_transactioncCs| d¡dS)NZresolvedrÔrNrrrÚ run_resolvedŒsz!SystemUpgradeCommand.run_resolvedcCs.t||d|jjddƒ}t|ƒr*|ƒdS)Nrr)ÚgetattrÚoptsrÅÚcallable)r?r¹ZsubfuncrrrrÕ�szSystemUpgradeCommand._call_subcCs(|jjtkr$tdƒj|d�}t|ƒ‚dS)NzFIncompatible version of data. Rerun 'dnf {command} download [OPTIONS]'©Úcommand)rÀr]Ú STATE_VERSIONrr¢r ©r?rÞr{rrrÚ_check_state_version”s  ÿz)SystemUpgradeCommand._check_state_versioncCs*|j|jj_|jjr|jjnd|jj_dSr )r½rµr2ÚcachedirrÀr_rNrrrÚ _set_cachediršs z"SystemUpgradeCommand._set_cachedircCsœttjjtjjgƒ}ttjjƒ}i}i}|jjjD]^}|j |vrn|j }|j |  |j ji¡  t|ƒi¡|j <q4|j |vr4|j |  t|j ƒi¡|j <q4||fS)z£ forward = {repoid:{pkg_nevra: {tsi.action: tsi.reason}} reverse = {pkg_nevra: {tsi.action: tsi.reason}} :return: forward, reverse )Úsetr$r•ZBACKWARD_ACTIONSÚlibdnfZ!TransactionItemAction_REINSTALLEDZFORWARD_ACTIONSr¶rµr‹ÚpkgÚreasonÚ setdefaultÚrepoÚidr„)r?Zbackward_actionZforward_actionsZforwardÚreverseZtsirærrrÚ%_get_forward_reverse_pkg_reason_pairsŸs   ÿÿÿ z:SystemUpgradeCommand._get_forward_reverse_pkg_reason_pairscCs`|j|jj_|jjr|jjnd|jj_d|jjkrH|jjsHtt dƒƒ‚nd|jjkr\d|j_dS)Núoffline-distrosynczFCommand 'offline-distrosync' cannot be used with --no-downgrade optionúoffline-upgradeF) r½rµr2rârÛr_rÞrgr rrNrrrÚpre_configure_download´s ÿ z+SystemUpgradeCommand.pre_configure_downloadcCs | ¡dSr ©rãrNrrrÚpre_configure_reboot¾sz)SystemUpgradeCommand.pre_configure_rebootcCs.| ¡|jjr|jj|j_|jj|jj_dSr ) rãrÀrirÛÚrepos_edr`rµr2r/rNrrrÚpre_configure_upgradeÁs z*SystemUpgradeCommand.pre_configure_upgradecCs | ¡dSr rðrNrrrÚpre_configure_cleanÇsz(SystemUpgradeCommand.pre_configure_cleancCsd|jjksd|jjkr´t tdƒ¡tƒ}|rLtdƒ}t | t|ƒ¡¡|j   ¡ržtdƒ}|j j j s†|j j jd |¡d |¡d�sžt td ƒ¡t d ¡t|j j |jjd �nd |jjkrÎ|j |j¡d |jj_d |jj_d |jj_d |jj_d |jj_|j j jdg7_dS)Nr}r»z\WARNING: this operation is not supported on the RHEL distribution. Proceed at your own risk.z-Additional information for System Upgrade: {}zyBefore you continue ensure that your system is fully upgraded by running "dnf --refresh upgrade". Do you want to continuez {} [y/N]: z {} [Y/n]: )r{Zdefaultyes_msgzOperation aborted.rŒ)r3rîTÚtest)rÛrÞrrDrrrr¢r rµZ _promptWantedr2ZassumenoÚoutputZ userconfirmÚerrorÚsysÚexitr4r/r¶Z _populate_update_security_filterÚdemandsÚ root_userÚ resolvingÚavailable_reposÚsack_activationZfreshest_metadataZtsflags)r?Zhelp_urlr{rrrÚconfigure_downloadÌs, ÿ       z'SystemUpgradeCommand.configure_downloadcCsd|jj_dSro©r¶rúrûrNrrrÚconfigure_rebootìsz%SystemUpgradeCommand.configure_rebootcCsðd|jj_d|jj_d|jj_d|jj_|jj|j_|jj durN|jj |j j _ |jj dur||j j  ¡D]}|j|jj v|_ qf|jjdurª|j j  ¡D]}|j|jjv|_q”|jj|j j _d|jj_d|j j _tƒ|jj_d|j j _d|j j _dS)NTF)r¶rúrûrürýrþrÀrgrÛrbrµr2rcÚreposÚvaluesrêrdÚ repo_gpgcheckrjZ cacheonlyZ assumeyesrˆZtransaction_displayZclean_requirements_on_removeZinstall_weak_deps)r?rérrrÚconfigure_upgradeñs&            z&SystemUpgradeCommand.configure_upgradecCsd|jj_dSrorrNrrrÚconfigure_clean sz$SystemUpgradeCommand.configure_cleancCsdSr rrNrrrÚ configure_logsz"SystemUpgradeCommand.configure_logcCs~|jjdksttdƒƒ‚| |jj¡|jj|jjkrRtdƒj|jjd�}t|ƒ‚t j   |j ¡rlttdƒƒ‚t j |j¡dS)NÚcompletezsystem is not ready for upgradezZthe transaction was not prepared for '{command}'. Rerun 'dnf {command} download [OPTIONS]'rÝzupgrade is already scheduled)rÀr^r rrárÛrÞrfr¢rrÚlexistsr¿r$r%rJr½rzrrrÚ check_reboots  ÿ z!SystemUpgradeCommand.check_rebootcCs¢tj |j¡s$t tdƒ¡tdƒ‚t |j¡|j krLt tdƒ¡tdƒ‚t j j   |j¡|jj}|sp|jj}| |¡|jjdksžtdƒj|d�}t|ƒ‚dS)Nz-trigger file does not exist. exiting quietly.rz1another upgrade tool is running. exiting quietly.Úreadyz/use 'dnf {command} reboot' to begin the upgraderÝ)rrr r¿rrrÚ SystemExitÚreadlinkr½r$ZyumZmiscZunlink_frÀrfrÛrÞrárer¢r ràrrrÚ check_upgrade!s  z"SystemUpgradeCommand.check_upgradecCs@t |j|j¡|j�}d|_Wdƒn1s20YdS)Nr )rÚsymlinkr½r¿rÀre©r?rÀrrrÚ run_prepare4sz SystemUpgradeCommand.run_preparecCsL| ¡|jjddksdS|jj|j_| tdƒt¡|j ¡t ƒdS)NrrzRebooting to perform upgrade.) rrÛrÅrhrÀrÑrÚREBOOT_REQUESTED_IDr6rrNrrrÚ run_reboot;s  ÿ zSystemUpgradeCommand.run_rebootcs̈jjrˆj ¡n ˆj ¡ˆjjdvr„ˆj ¡‡fdd„ˆjjjDƒ}|r\ˆj |¡‡fdd„ˆjjj Dƒ}|r„ˆj |¡ˆj �.}d|_ ˆjj j |_ˆjj j|_Wdƒn1s¾0YdS)N)rîrícs$g|]}ˆjjj |j¡r|j‘qSr)rµÚhistoryÚgrouprYrê©Ú.0ÚgrNrrÚ Tóz5SystemUpgradeCommand.run_download..cs$g|]}ˆjjj |j¡r|j‘qSr)rµrÚenvrYrêrrNrrrWrZ downloading)rÛrgrµZ upgrade_allrÞZ read_compsÚcompsÚgroupsZenv_group_upgradeZ environmentsrÀr^r2r/r`r_)r?Zinstalled_groupsZinstalled_environmentsrÀrrNrÚ run_downloadJs       z!SystemUpgradeCommand.run_downloadcCs®d}|j�}d|_|j}Wdƒn1s,0Y|dkrHtdƒ}n|dkrZtdƒ}ntdƒ}| |t¡t ¡t d¡t  |¡t ƒt |j |j ƒ|_|j ¡dS) NÚZ incompleterîz1Starting offline upgrade. This will take a while.ríz4Starting offline distrosync. This will take a while.z0Starting system upgrade. This will take a while.r)rÀrerfrrÑÚUPGRADE_STARTED_IDr�r‚r†r|r:r rµr¾Úreplayr×)r?rÞrÀr{rrrÚ run_upgrade`s $     z SystemUpgradeCommand.run_upgradecCsxt tdƒ¡t|jjjtj  |jjj¡j gƒ|j �.}d|_ d|_ d|_d|_d|_Wdƒn1sj0YdS)NzCleaning up downloaded data...)rrrr+rµr2râr$Z persistorZTempfilePersistorZdb_pathrÀr^r]rerfr_rrrrÚ run_cleanzs ÿzSystemUpgradeCommand.run_cleancCs |jjrt|jjƒntƒdSr )rÛÚnumberr­r¤rNrrrÚrun_log‡szSystemUpgradeCommand.run_logcCs|j ¡dS)z5Adjust transaction reasons according to stored valuesN)r!Zpost_transactionrNrrrÚresolved_upgrade�sz%SystemUpgradeCommand.resolved_upgradec CsÆ|jj ¡}| ¡s&t tdƒ¡dSt|ƒ}z`t|j dƒ�,}t j ||ddd�|  d¡Wdƒn1sn0Yt tdƒ |j ¡ƒWn>tyÌ}z&tj tdƒ t|ƒ¡¡‚WYd}~n d}~00tj |jjj¡}|j� }d |_t|_|jj|_|jjj|_d d „|jj  ¡Dƒ|_!d d „|jj  ¡Dƒ|_"||_#|jjj$|_%|jjj&|_&|jj'|_(|jjj)|_)|jj*|_+Wdƒn1�sŽ0Yt,j|jj*d �}t |¡| -tdƒt.¡dS)NzKThe system-upgrade transaction is empty, your system is already up-to-date.rFrGTrHÚ zTransaction saved to {}.zError storing transaction: {}rcSsg|]}|jr|j‘qSr)rbrê©rrérrrr®sz=SystemUpgradeCommand.transaction_download..cSsg|]}|jr|j‘qSr)rrêr(rrrr°srÝzDownload finished.)/rµrZ get_currentZpackagesrrrr rr¾rArLr6r8r¢r'r$r¶r r„r,r-r2r.rÀr^rßr]rÛrgrbrrrcrdrar/r`rjròrir_rÞrfÚDOWNLOAD_FINISHED_MSGrÑÚDOWNLOAD_FINISHED_ID)r?r•ÚdataÚfr9Z system_verrÀr{rrrÚtransaction_download•sB (0   ÿ ÿ    * z)SystemUpgradeCommand.transaction_downloadcCsX|jjrtdƒ}ntdƒ}t |¡| |t¡| ¡|jj ddkrTt |jjƒdS)Nz1Upgrade complete! Cleaning up and powering off...z.Upgrade complete! Cleaning up and rebooting...rr®) rÀrhrr�r|rÑÚUPGRADE_FINISHED_IDr#rÛrÅr)r?Zupgrade_complete_msgrrrÚtransaction_upgrade½s   z(SystemUpgradeCommand.transaction_upgrade))rkrlrmÚaliasesrÚsummaryr¼r@Ú staticmethodrÎrÑrÓrÖr×rØrÙrÕrárãrìrïrñrórôrÿrrrrr rrrrr"r#r%r&r-r/rºrrr·rr²ZsH       (r²c@seZdZdZedƒZdS)r³)rîz%Prepare offline upgrade of the systemN©rkrlrmr0rr1rrrrr³Ësr³c@seZdZdZedƒZdS)r´)ríz(Prepare offline distrosync of the systemNr3rrrrr´Ðsr´)F)N)?r‡Ú subprocessrrrrrArZos.pathr~røZuuidZsystemdrZdnfpluginscorerrr$Zdnf.clir Zdnf.i18nr Zdnf.transactionZdnf.transaction_srr r Z libdnf.confråZUUIDr*rr r.r¡rur0r)r1rßrrr+r4r:Úobjectr;rnr�rŽZTransactionProgressrˆrœr¤r§r­rÌZPluginr°r¶ZCommandr²r³r´rrrrÚsj       ÿÿÿ    A.  s