3 Qf}+@sddlmZddlmZddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g+Zdd.lZdd.lZdd.lZdd/lm Z dd.l Z dd0l m Z dd.l Z dd.lZdd.lZdd.lZdd.lZdd.lZdd.lZdd.lZdd.lZdd1lTdd.lZdd2lmZdd3lmZmZdd4lmZdd1lTd5d6Zd7d8Z d9Z!dZ"d.Z#ej$d:r`d:Z#nej$d;rpdZ)ej(d?Z*ej(d@Z+ej(dAZ,ej(dBZ-ej(dCZ.d.a/ej0a1ej2ej3ej0ej4ej5dDZ6dEdFZ7dGd#Z8dHd*Z9dId)Z:dJdZ;dKdZddNdZ?dOdZ@ddRdZAddSd ZBddUd ZCdVd ZDdWd ZEdXd ZFdYdZGdZdZHd[dZId\dZJydd]lKmLZLeLZMWngZMYnXd^dZNd_dZOd`daZPdbdcZQddedZRdfdZSdgdZTdhd ZUdid!ZVdjd$ZWddkd%ZXdld"ZYddmdZZdndoZ[ddpdZ\dqdZ]ddrdZ^dsdZ_dtdZ`dudZadvd&Zbejcejd dwZeejfrejcejg dwZhneeZheheeZiejcdZjejcdxdyZkGdzd{d{ejlZmGd|d}d}ejlZnGd~d+d+ZoGdd,d,e j Zpe jqepd.S))absolute_import)rangeaudit_msg_decode merge_listspreextend_listfmt_objformat_elapsed_timeformat_2_column_name_value wrap_text format_msgremove_linebreaks default_textdefault_date_textget_standard_directoriesget_rpm_nvr_from_headerget_package_nvr_by_nameget_package_nvr_by_file_pathget_rpm_nvr_by_typeget_rpm_nvr_by_scontextget_rpm_source_packageis_hex split_rpm_nvr file_typesget_user_home_dirget_plugin_names load_pluginsget_os_environment find_program get_identity get_hostnamemake_database_filepathvalid_email_addresslaunch_web_browser_on_urlabstract log_debugget_error_from_socket_exception!assure_file_ownership_permissionsparse_datetime_offsetDATABASE_MAJOR_VERSIONDATABASE_MINOR_VERSIONdatabase_version_compatible syslog_trace TimeStampRetryPACKAGE_MANAGERN) SystemBus)GObject)*) cmp_to_key) FunctionType MethodType) get_configcCs||k||kS)N)xyr6r6/usr/lib/python3.6/util.py\sr:c Cs*y t|tStk r$t|tSXdS)N) isinstanceZTypeType NameErrortype)objr6r6r9is_type_s r?rpmdpkgdebz/etc/redhat-releasez \s*\n+\s*z^[A-Fa-f0-9]+$zz^([^\s@]+)@([^\s@]+)$z^\s*"([^"]+)"\s*$z\s*\(\s*type\s+([\w-]+)\s*\)\s*)ZCRITICALZERRORZWARNINGINFODEBUGcCs&tjt|djatdkr"tjadS)Nlevel) log_levelsgetr5upper log_levelsyslog LOG_WARNING)Zsectionr6r6r9log_initsrMcCsttjkrtjtj|dS)N)rJrK LOG_DEBUG)msgr6r6r9r$s cCs.|jd}x|D]}t|rtj|qWdS)N )splitlenrK)ZtraceZ log_linesliner6r6r9r+s  cCszd}}|jd}t|dkr*t|d}t|dkrBt|d}|tkr`td|ttfdStd|ttfdSdS) N.rz=database version %s not compatible with current %d.%d versionFz9database version %s compatible with current %d.%d versionT)rQrRintr(r$r))versionmajorminor componentsr6r6r9r*s     cCs|dkr dSddl}|j|\}}t|}|d}||d}|d}||d}|d}||d}|r~d|||||fS|rd||||fS|rd|||fSd||S) NriQi<z%dd:%dh:%dm:%.3fsz %dh:%dm:%.3fsz %dm:%.3fsz%.3fs)mathZmodfrW)Z elapsed_timer]ZfractionZwholedayshoursminutessecondsr6r6r9rs$   cCstj|rdSdSdS)NTF)hex_rematch)strr6r6r9rs c Csj|dkr dStj|}|r&|jd}n@y.tjddkrB|jd}ntj|jd}Wn|}YnX|S)NrUrr@hexzutf-8)audit_decode_researchgroupsys version_infodecode bytearrayfromhex)rOrcZdecodedr6r6r9rs    cCsP|s|S|s|Si}x|D] }d||<qWx|D] }d||<q0Wt|j}|S)z2return a list containing the unique members of a+bN)listkeys)abdimr6r6r9rs     cs^|dkr g}t|}||}|dkrZtrJ|jfddt|Dn|jg||S)Nrcsg|] }qSr6r6).0r7)defaultr6r9 sz"preextend_list..)rRr?extendr)Zrequested_lengthZ_listrvZ cur_lengthZdeltar6)rvr9rscsttjrStttfr:ddjddDdSttrxtj}|jddjfdd|DdSt SdS) N[ cSsg|]}dt|qS)z%s)r)rur7r6r6r9rwszfmt_obj..]{cs$g|]}dt|t|fqS)z%s=%s)r)rukey)r>r6r9rws}) r;six string_typesrntuplejoindictrosortrd)r>ror6)r>r9rs    PcCsxt||kr"|d|dd}n|d|t|}| sD|jrP||dS|t_d|t_|t_tj|dSdS)NrrUrzrP)rRisspace text_wrapperinitial_indentsubsequent_indentwidthfill)namevalueZ value_indentZ page_widthrr6r6r9r s   cCs(d|}|t_|t_|t_tj|dS)NrzrP)rrrrr)srindentprefixr6r6r9r s cCsD|dkr d}|j}d|}|t_|t_dt_|dtj|dS)NrzrrPz )striprrrrr)titlerOrZ indentStringr6r6r9r #scCs$tjd|j}|dkrdS|SdS)Nrzr)fix_newline_resubr)rdZnew_strr6r6r9r .scCs |dkrdtdd}t|S)N)_rd)valr6r6r9r 6scCs|dkrt|S|jS)N)r format)Zdater6r6r9r<sc Cszg}yPtdkr,tjdddgddjjd}tdkrRtjdd d gddjjd}Wn tjtjd jtYnX|S) z3 >>> get_standard_directories() [...'/bin'...] rAz-qlZ filesystemT)universal_newlinesrPrCrBz-Lz base-fileszfailed to get list from {})r. subprocess check_outputrstriprQrKLOG_ERRr)Zlstr6r6r9rBs"cCs&|d}|d}|d}d|||fS)z6Given an RPM header return the package NVR as a stringrrXreleasez%s-%s-%sr6)ZhdrrrXrr6r6r9rTsc Csz|dkr dSd}yFtdkr2tjdd|gddj}tdkrTtjddd |gddj}Wntjtjd |YnX|S) zJ >>> get_package_nvr_by_name("coreutils") 'coreutils-8.30-3+b1:amd64' NrAz-qT)rrCz dpkg-queryz(-f=${Package}-${Version}:${Architecture}z-Wz"failed to retrieve rpm info for %s)r.rrrrKr)rnvrr6r6r9r\sc Cs|dkr dStjj|}tjj|s(dSd}ydtdkrNtjdd|gddj}tdkrtjdd|gjj d d }tjd d d |gddj}Wnt j t j d|YnX|S)zM >>> get_package_nvr_by_file_path("/bin/ls") 'coreutils-8.30-3+b1:amd64' NrAz-qfT)rrCrBz-Sz: rz dpkg-queryz(-f=${Package}-${Version}:${Architecture}z-Wz"failed to retrieve rpm info for %s) ospathabspathexistsr.rrrrkrQrKr)rrZ package_namer6r6r9rrs   )get_all_file_typescCs6|jd}|d}|d}dj|dd}|||fS)N-rUrVr)rQr)rr[rrXrr6r6r9rs  cCs.tdkrttdkrdStj|d}t|S)aV Finds an SELinux module which defines given SELinux type ##### arguments * `selinux_type(s)`: an SELinux type ##### return values * `nvr(s)`: nvr of rpm which ships module where `selinux_type` is defined ##### usage >>> get_rpm_nvr_by_type("sshd_t") 'selinux-policy-... >>> get_rpm_nvr_by_type("mysqld_log_t") 'mysql-selinux-... N)module_type_cachebuild_module_type_cacherHr)Z selinux_typerr6r6r9rs  c Csy t|dSdSdS)NTF)rW)rdr6r6r9 __str_is_ints rc Cstj\}}|dkrdSt}g}tjdj| }tdd|Dddd}WdQRXx|D]}xtjd j||D]\}}}d |krvyjytj d j|d d } Wnt d j|} YnXx(| D] } t j | } | r||| j d<qW| j WqvYqvXqvWq^W|adS)z Creates a dictionary with all types defined in the module store as keys and corresponding module paths as values. The dictionary is stored in "module_type_cache" to be used by "get_rpm_nvr_by_type" rNz"/var/lib/selinux/{}/active/modulescSs$g|]}|jrt|jr|jqSr6)is_dirrr)rur7r6r6r9rwsz+build_module_type_cache..cSst|S)N)rW)r7r6r6r9r:sz)build_module_type_cache..)r}z%/var/lib/selinux/{}/active/modules/{}Zcilz{}/cilZrt)moderU)selinuxZselinux_getpolicytyperrscandirrsortedwalkbz2opentypedef_regexprcrhcloser) ZretvalZ policytypeZmodule_type_dictZ prioritiesZ module_storedirdirpathZdirnames filenamesfrSresultr6r6r9rs. $    rFcCsJ|r&t}|jd}t|jt|Stjt|}tttj|SdS)a Finds an SELinux module which defines given SELinux context ##### arguments * `scontext(s)`: an SELinux context ##### return values * `nvr(s)`: nvr of rpm which ships module where SELinux type used in `scontext` is defined ##### usage >>> get_rpm_nvr_by_scontext("system_u:system_r:syslogd_t:s0") 'selinux-policy-... >>> get_rpm_nvr_by_scontext("system_u:system_r:mysqld_log_t:s0") 'mysql-selinux-... >>> get_rpm_nvr_by_scontext("system_u:system_r:timedatex_t:s0", use_dbus=True) 'selinux-policy-... z*org.fedoraproject.SetroubleshootPrivilegedN)r/rHrdrrZ context_newrZcontext_type_get)ZscontextZuse_dbusZbusZ remote_objectcontextr6r6r9rs  c Csd|dkr dSd}y0ddl}|jdddd|gddjd d d}Wntjtjd |YnX|S) z Find a source package for `name` rpm >>> get_rpm_source_package("policycoreutils-python-utils") 'policycoreutils' >>> get_rpm_source_package("selinux-policy-targeted") 'selinux-policy' NrrAz-qz--qfz %{SOURCERPM}T)rrrVz"failed to retrieve rpm info for %s)rrrsplitrKr)rsrcrr6r6r9rs (c Cs6tj}ytj|}Wntk r*dSX|j}|S)N)rgetuidpwdgetpwuidKeyErrorpw_dir)uidZpwZhome_dirr6r6r9r+scCstj|}|rdSdSdS)NTF)name_at_domain_rerg)Zaddressrcr6r6r9r!5s cCs tdd}tjtj|||dS)NZ helper_appsweb_browser_launcher)r5rspawnlP_NOWAIT)Zurlrr6r6r9r"=s cCs6t|dd}|r"|d}|d}n t}t|}||fS)NargsrrU)getattrZERR_SOCKET_ERRORZ get_strerror)ererrnostrerrorr6r6r9r%Bs  c /Csd}tjj|sfyt|d}|jWn>tk rd}z"d}tjtjd||jfWYdd}~XnXytj ||Wn@t k r}z$d}tjtjd|||jfWYdd}~XnXybt |t r|}nt j|d}|dkr|}t |t r|}nddl} | j|d}tj|||Wn`t k rz}zBd}ddl} tjtjd|t j|d| j|d|jfWYdd}~XnX|S) NTwFzcannot create file %s [%s]zcannot chmod %s to %o [%s]rVrzcannot chown %s to %s:%s [%s])rrrrr ExceptionrKrrchmodOSErrorr;rWrgetpwnamgrpZgetgrnamchownrZgetgrgid) filepathrownerrhrrrrgidrr6r6r9r&Ms:   *,  BcCs<ddl}|j|jdd}|jj}td|||fdS)NrrUr@z=%s must be implemented in subclass %s or ancestor class of %s)inspectZgetouterframesZ currentframe __class____name__NotImplementedError)r>rmethodsubclassr6r6r9r#ws cCs|dkrd}ntjdd|}tdd}g}xXtjtjj||dD]<}tjj|}|d kr^qDtjjtjj|d}|j |qDW|S) Nr1z.py$rplugins plugin_dirz.py __init__.pyr)r) rerr5globrrrbasenamesplitextappend) filter_globr plugin_namesp plugin_namer6r6r9rs  cCs|j|jS)N)Z get_priority)r7r8r6r6r9 sort_pluginssrc Csvtdd}tjj|}g}t|}td||}d}|tjkry0ddl}|j ||g\}} } |j ||| | } Wn&t k rt j t j d|gSX|r|jx|D]}d||f}tjj|} | dk rtd||j| jqy>ddl}|j ||g\}} } |j ||| | } |j| jWn(t k rPt j t j d |YnX|r|jqW|jttd |S) Nrrzload_plugins() names=%s__init__rz"failed to initialize plugins in %sz%s.%sz%load_plugins() %s previously importedzfailed to load %s plugin)r})r5rrrrr$rimodulesimp find_module load_modulerrKrrrHrZpluginrr2r) rrZ plugin_baserrZ module_namerrZmod_fpZmod_pathZmod_descriptionmodr6r6r9rsF         cCs~yttjdj}Wn8yddl}dj|j}Wnd}YnXYnXtj}|d}|d}d||f}||fS)NrrzunknownrVrz%s %s) rredhat_release_path readlinesrdistrorZlinux_distributionruname)Z myplatformrrZkernel_releaseZcpuZos_descr6r6r9rs c Cs@|dkrtj}ytj|}Wntk r2dSX|d}|S)Nr)rrrrr)rZ pwd_entryZusernamer6r6r9rscCsLyddl}|j}|Stk rF}ztjtjd|dSd}~XnXdS)Nrzcannot lookup hostname: %s)ZsocketZ gethostnamerrKr)ZSocketZhostnamerr6r6r9rscCs\tjj|r|Stjj|}tddjd}x*|D]"}tjj||}tjj|r2|Sq2WdS)NZ fix_commandZprog_search_path:)rrisabsrr5rQrr)progrZ search_pathrrrr6r6r9rs    cCs2tdd}tjdd|}|d}tjj||}|S)NZdatabase database_dirz\.xml$rz _database.xml)r5rrrrr)rrfilenamerr6r6r9r s  c Cs$tjd}d}d}d}d}d}|j}x|j|D]}|r2d}t|jd}|jd} | dk r2| dkrr||d 7}| d kr||d 7}| d kr||d 7}| dkr||7}| dkr||7}| dkr||7}| dkr2||7}q2W|r tj||||d} td|| f| St j t j d|dSdS)zThe time offset may be specified as a sequence of integer unit pairs. Units may be one of year,month,week,day,hour,minute,second and may optionally be plural. Example: '2 weeks 1 day' sets the threshold at 15 days. z0(\d+)\s*(year|month|week|day|hour|minute|second)FrTrUrVNyearimmonthZweekdayhourminutesecond)r^r_r`raz)parse_datetime_offset(%s) = time delta %sz$could not parse datetime offset (%s)) rcompilelowerfinditerrWrhdatetime timedeltar$rKr) textZdatetime_offset_refoundr^r_r`rarcZquantityZunitZtdr6r6r9r'sB      )rarU)r_c@s,eZdZddZddZddZddZd S) LocalTimezonecCs|j|rtStSdS)N)_isdst DSTOFFSET STDOFFSET)selfdtr6r6r9 utcoffset=s zLocalTimezone.utcoffsetcCs|j|rtStSdS)N)r DSTDIFFZERO)rrr6r6r9dstCs zLocalTimezone.dstcCstj|j|S)N)timetznamer )rrr6r6r9rIszLocalTimezone.tznamec CsD|j|j|j|j|j|j|jddf }tj|}tj |}|j dkS)NrrUr) rrrrrrweekdayrZmktimeZ localtimeZtm_isdst)rrZttZstampr6r6r9r Ls     zLocalTimezone._isdstN)r __module__ __qualname__rrrr r6r6r6r9r ;sr c@s(eZdZdZddZddZddZdS)UTCcCs tjdS)Nr)rr )rrr6r6r9rXsz UTC.utcoffsetcCsdS)Nrr6)rrr6r6r9r[sz UTC.tznamecCs tjdS)Nr)rr )rrr6r6r9r^szUTC.dstN)rrr__doc__rrrr6r6r6r9rUsrc@seZdZeZeZdZdZd#ddZ ddZ dd Z d d Z d d Z ddZd$ddZddZddZddZd%ddZddZddZd&d!d"ZdS)'r,z%Y-%m-%dT%H:%M:%SZz%cNcCs|dkr|jdd|_nft|tjr0|j|nNt|trNtjj||j |_n0t|tjrb||_nt|t rv|j|_nt ddS)NF)localz-must be string, float, datetime, or TimeStamp) now_dtr;rrparsefloatrZ fromtimestamputc_tzr, TypeError)rtr6r6r9rjs      zTimeStamp.__init__cCs$t|tr|j|jkS|j|kSdS)N)r;r,r)rotherr6r6r9__lt__xs  zTimeStamp.__lt__cCs$t|tr|j|jS|j|SdS)N)r;r,r)rr%r6r6r9__add__~s  zTimeStamp.__add__cCs.t|tr|j|j7_n|j|7_|S)N)r;r,r)rr%r6r6r9__iadd__s zTimeStamp.__iadd__cCs$t|tr|j|jS|j|SdS)N)r;r,r)rr%r6r6r9__sub__s  zTimeStamp.__sub__cCs.t|tr|j|j8_n|j|8_|S)N)r;r,r)rr%r6r6r9__isub__s zTimeStamp.__isub__FcCs$|rtjj|jStjj|jSdS)N)rrlocal_tzr")rrr6r6r9rsz TimeStamp.nowcCs|jj|jS)N)rZ astimezoner+)rr6r6r9rszTimeStamp.localcCs|j|jddS)NF)r)r iso8601_fmt)rr6r6r9__str__szTimeStamp.__str__c CsBtj||j\ }}}}}}}} } tj||||||d|j|_|jS)Nr)rZstrptimer,rr"r) rrdrrrrrrrZyeardayrr6r6r9r s  zTimeStamp.parsercCs |jtj||||d7_dS)N)r^r_r`ra)rrr )rr^r_r`rar6r6r9addsz TimeStamp.addcCs|j}||jkrdSdSdS)NTF)rr)rrr6r6r9 in_futures zTimeStamp.in_futurecCs|j}||jkrdSdSdS)NTF)rr)rrr6r6r9in_pasts zTimeStamp.in_pastTcCs0|dkr|j}|r |jj|S|jj|SdS)N) locale_fmtrZstrftimer)rZfmtrr6r6r9rs zTimeStamp.format)N)F)rrrr)NT)rrrrr"r r+r,r1rr&r'r(r)r*rrr-r r.r/r0rr6r6r6r9r,bs$   c@sheZdZdZdejjdejejffiZ dddZ ddZ ddd Z dd d Z d dZddZddZdS)r-al A class which schedules attempts until one succeeds. Intervals are expressed as floating point seconds. The retry attempt will be scheduled in the future based on the retry_interval which may be either a number of seconds or a callable object returning the number of seconds. The callable form of the retry_interval is useful when the interval should be adjusted based on prior history or other external factors, e.g. backing off the frequency of the retry attempts if initial attempts fail. The retry callback should return False if the attempt fails, in which case it will be scheduled again in the future based on the current value obtained from the retry_interval. If the retry callback returns True it indicates the retry attempt succeeded and no more attempts will be made. Retry's are started with the start() method and continues until the retry callback returns True or the stop() method is called. It is always safe to call stop() even if a retry is not pending. The retry callback, user_data and notify_interval may be specified in either the class init() or in the start() method for convenience. If notify_interval is set a 'pending_retry' signal will be emitted every time the notification interval elapses, this provides a countdown till the next retry attempt. The signature of the retry callback is: callback(retry_obj, user_data) The signature of the pending_retry signal handler is: callback(retry_obj, seconds_pending, user_data) The signature of the retry interval function is: interval(retry_obj, user_data) pending_retryNcCs:tjj|||_||_||_d|_||_d|_d|_dS)Nr) r0rcallbackretry_interval user_datafailed_attemptsnotify_interval trigger_time timeout_id)rr3r4r5r7r6r6r9rs zRetry.__init__cCs |jdk rtj|jd|_dS)N)r9ZGLibZ source_remove)rr6r6r9stops  z Retry.stopcCsF|dk r||_|dk r||_|dk r*||_|jd|_|jddS)NrT)r4r5r7r:r6_schedule_alarm)rr4r5r7r6r6r9startsz Retry.startFcCshtj}|r||j|_|j|}|jrH|jd||jt|j|}n|}tjt |d|j |_ dS)Nr2i) r_get_retry_intervalr8r7emitr5minr0Z timeout_addrW_alarm_callbackr9)rZ new_retryrseconds_pendingZ alarm_timer6r6r9r; s zRetry._schedule_alarmcCs6d|_tj}|j|}|dkr*|jn|jdS)Ng{Gzt?F)r9rr8_attempt_retryr;)rrrAr6r6r9r@s  zRetry._alarm_callbackcCs4|j||jr|jn|jd7_|jddS)NrUT)r3r5r:r6r;)rr6r6r9rB-s zRetry._attempt_retrycCs"ttttfr|j||jS|jS)N)r;Z interval_typer4r3r4r5)rr6r6r9r=4szRetry._get_retry_interval)NN)NNN)F)rrrrr0Z SignalFlagsZRUN_LASTZ TYPE_FLOATZ TYPE_PYOBJECTZ __gsignals__rr:r<r;r@rBr=r6r6r6r9r-s$  )NN)rr)rr)r)F)N)N)N)N)rZ __future__rZ six.movesr__all__rrrZpydbusr/rZ gi.repositoryr0rrrZshutilrrritextwraprtypesrK functoolsr2r3r4Zsetroubleshoot.configr5Zsetroubleshoot.errcodeZcmpr?r(r)r.ZwhichrZ TextWrapperrrrrbZhref_rerrfrrrLrJZLOG_CRITrZLOG_INFOrNrGrMr$r+r*rrrrrrr r r r r rrrrrZsepolicyrrrrrrrrrr!r"r%r&r#rrrrrrrr r'r ZtimezonerZdaylightZaltzonerrrZHOURZtzinfor rr,r-Z type_registerr6r6r6r9s&                       0   *  ,    /   fq