o `[=@sdZddlmZddlmZddlmZddlZddlZddlZddl Z dZ dZ dZ dZ dZd Zd Zdad ad d Zd dZddZdJddZddZGdddeZejdfddZdKddZddZddZd d!ZdLd"d#ZdLd$d%Z d&d'Z!Gd(d)d)eZ"e"jdfd*d+Z#Gd,d-d-eZ$e$jdfd.d/Z%e$jdfd0d1Z&Gd2d3d3ej'Z(Gd4d5d5ej'Z)d6d7Z*Gd8d9d9ej+Z,Gd:d;d;ej+Z-Gdd?d?ej'Z/d@dAZ0dBdCZ1dDdEZ2dFdGZ3dHdIZ4dS)Mz1Log various messages depending on verbosity level)division)str)objectN FcCs t|dS)z[Convert duplicity level to the logging module's system, where higher is more severe)MAXverbr //usr/lib/python3/dist-packages/duplicity/log.pyDupToLoggerLevel. rcCst|S)zVConvert logging module level to duplicity's system, where lower is more severe)rr r r rLoggerToDupLevel4srcCs4|dkrdS|dkr dS|dkrdS|dkrdSd S) NrDEBUGrINFOrNOTICEr WARNINGERRORr )levelr r r LevelName:srr cCs|r d||f}nd|}|sd}|rt}tttt|ts)|dd}tjt||t |||dd|rBt|dSdS) z/Write s to stderr if verbosity level low enoughz%d %s%dutf8replace) levelName controlLinetransferProgress)extraN) _loggergetEffectiveLevelsetLevelrr isinstancerdecodelogr)s verb_levelcoder force_printtransfer_progressr initial_levelr r rLogGs&   r-cCt|tdS)z.Shortcut used for debug message (verbosity 9).N)r-rr'r r rDebuger0c@sLeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdS)InfoCodezEnumeration class to hold info code values. These values should never change, as frontends rely upon them. Don't use 0 or negative numbers.r rrr N)__name__ __module__ __qualname____doc__genericprogresscollection_status diff_file_newdiff_file_changeddiff_file_deletedpatch_file_writingpatch_file_patching file_listsynchronous_upload_beginasynchronous_upload_beginsynchronous_upload_doneasynchronous_upload_doneskipping_socketupload_progressr r r rr2js"r2cCt|t||dS)z.Shortcut used for info messages (verbosity 5).N)r-rr'r)r r r rInforScCs.|r d||f}nd|}t|ttj|dS)z2Shortcut used for progress messages (verbosity 5).z%d %drN)r-rr2rC)r'currenttotalrr r rProgresssrWcCsVtj|d}t|jd\}}t|d\}}d}|jdkr!d|j}d||||f}|S)Nseconds<rrz%dd,z%s%02d:%02d:%02ddatetime timedeltadivmodrYdayssecstdeltahoursremminutesrYfmtr r r_ElapsedSecs2Strs   rhcCs tj|d}t|jd\}}t|d\}}d}|jdkr7d|j}|dkr+d||f}|dkr5d||f}|S|dkrKd |}|dkrId||f}|S|d krUd |}|S|dkrgd |}|d kred |}|S|dkrod}|S|d krwd}|S|dkrd}|Sd|}|S)NrXrZr[rrz%ddz%s %dhz%s %dminz%dhrz%dminz%s 30sec-z< 1minz< 45secr<z< 30secz%dsecr\rar r r_RemainingSecs2StrsF        rkc Cstd|}t|d}d}|dkr|d}d}|dkr"|d}d}|r+d} d} d } n t|} t|d} d} | dkrA| d} d} | dkrK| d} d} d ||t|| | d |d d ||| f } d||||||f} t| ttj| dddS)z9Shortcut used for upload progress messages (verbosity 5).g?g@KBg@@MBGBzStalled!rBz(%.1f%s %s [%.1f%s/s] [%s>%s] %d%% ETA %s= (z%d %d %d %d %d %dT)r+N)intfloatrkrhr-rr2rP)rCeta changed_byteselapsedspeedstalleddots data_amount data_scaleeta_str speed_amount speed_scaler'rr r rTransferProgresss>   rc Cs(tt|dtjdd||dS)%Prints a collection status to the logr6 N)r-rr2rDjoin to_log_info) col_statsr*r r rPrintCollectionStatussrcCs tt||dtjd|dS)rr6N)r-rget_file_changed_recordr2rD)rfilepathr*r r r PrintCollectionFileChangedStatuss rcCr.)z=Shortcut used for notice messages (verbosity 3, the default).N)r-rr/r r rNoticer1rc@sDeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdS) WarningCodezEnumeration class to hold warning code values. These values should never change, as frontends rely upon them. Don't use 0 or negative numbers.r rrr3rr4r5r6rr7r8r9r:N)r>r?r@rArB orphaned_sigunnecessary_sig unmatched_sigincomplete_backuporphaned_backupftp_ncftp_v320cannot_iterate cannot_stat cannot_readno_sig_for_timecannot_processprocess_skippedr r r rrsrcCrQ)z0Shortcut used for warning messages (verbosity 2)N)r-rrRr r rWarnrTrc@seZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7S)8 ErrorCodeaEnumeration class to hold error code values. These values should never change, as frontends rely upon them. Don't use 0 or negative numbers. This code is returned by duplicity to indicate which error occurred via both exit code and log.r rrr3rr4r5r6rr7r8r9r:r;r<r=ri !"#$%&'rr*+,rj./01234567N)9r>r?r@rArB command_linehostname_mismatch no_manifestsmismatched_manifestsunreadable_manifestscant_open_filelistbad_urlbad_archive_dir bad_sign_keyrestore_dir_existsverify_dir_doesnt_existbackup_dir_doesnt_existfile_prefix_errorglobbing_errorredundant_inclusioninc_without_sigsno_sigsrestore_dir_not_foundno_restore_filesmismatched_hashunsigned_volume user_errorboto_old_styleboto_lib_too_oldboto_calling_formatftp_ncftp_missingftp_ncftp_too_old exception gpg_faileds3_bucket_not_stylenot_implementedget_freespace_failednot_enough_freespaceget_ulimit_failedmaxopen_too_lowconnection_failedrestart_file_not_foundgio_not_availablesource_dir_mismatchftps_lftp_missingvolume_wrong_sizeenryption_mismatchpythonoptimize_set dpbx_nologin bad_request s3_kms_no_id backend_errorbackend_permission_deniedbackend_not_foundbackend_no_spacebackend_command_errorbackend_code_errorr r r rrsnrcCrQ)zWrite error messageN)r-rrRr r rErrorKrTrcCs"t|t||tt|dS)z"Write fatal error message and exitN)r-rshutdownsysexitrRr r r FatalErrorPsrc@eZdZdZddZdS) OutFilterz:Filter that only allows warning or less important messagescCs|jo |jttkSNmsglevelnorrselfrecordr r rfilterYzOutFilter.filterNr>r?r@rArr r r rrW rc@r) ErrFilterz=Filter that only allows messages more important than warningscCs|jo |jttkSrrrr r rr_rzErrFilter.filterNrr r r rr]rrcCstrdSdtjddvrdatdattttj }tr'| t n| t | tt|ttj}trG| t n| t | tt|dS)zInitialize loggingNz--log-timestampr T duplicity)r!rargv_log_timestamplogging getLogger setverbosityr StreamHandlerstdout setFormatterDetailFormatterPrettyProgressFormatter addFilterr addHandlerstderrr) outHandler errHandlerr r rsetupcs$        rc@s$eZdZdZdZddZddZdS)r zCFormatter that overwrites previous progress lines on ANSI terminalsFcCtj|ddS)Nz %(message)sr Formatter__init__rr r rrz PrettyProgressFormatter.__init__cCs.tj||}|jr|jrd|}|j|_|S)Nz)rrformatlast_record_was_progressrrrr'r r rrs  zPrettyProgressFormatter.formatN)r>r?r@rArrrr r r rr s  r c@ eZdZdZddZddZdS)r zAFormatter that creates messages in a syntax somewhat like syslog.cCr)Nz%%(asctime)s %(levelName)s %(message)srrr r rrrzDetailFormatter.__init__cCstj||}|Sr)rrrrr r rrszDetailFormatter.formatNr>r?r@rArrr r r rr  r c@r)MachineFormatterzQFormatter that creates messages in a syntax easily consumable by other processes.cCr)Nz%(levelName)s %(controlLine)srrr r rrrzMachineFormatter.__init__cCs2tj||}|jr|d|jdd7}|dS)Nrz . )rrrmessagerrr r rrszMachineFormatter.formatNrr r r rr rr c@r) MachineFilterzFFilter that only allows levels that are consumable by other processes.cCs t|dS)Nr)hasattrrr r rrs zMachineFilter.filterNrr r r rr"rr"cCs8tt|d}|t|tt |dS)z5Add stream to which to write machine-readable loggingwN) rr osfdopenr r rr"r!r)fdhandlerr r radd_fds  r)cCs4tj|dd}|t|tt|dS)z3Add file to which to write machine-readable loggingr)encodingN)r FileHandlerr r rr"r!r)filenamer(r r radd_files  r-cCstt|dS)zSet the verbosity levelN)r!r#rr r r rrsrcCs ttS)zGet the verbosity level)rr!r"r r r r getverbosityrr.cCs tdS)zCleanup and flush loggersN)rrr r r rrrr)r NFFr)F)5rA __future__rbuiltinsrrr]rr%rMINrrrrrr r!rrrrr-r0r2rBrSrWrhrkrrrrrrrrrFilterrrrrr r r r"r)r-rr.rr r r rs`        % E$