3 g@sddlmZddlmZy ddlZWnek r@ddlZYnXddlZejdddZe edsjeje_ ej Z dd idd idd idd idd idd idd idd id Z d d Z GdddejZdS))config) up2dateErrorsNzrhn-client-toolsT)ZfallbackugettextversionZ211) caneatCheesesupportsAutoUp2dateOptionzregistration.finish_messagez xmlrpc.packages.extended_profilezregistration.delta_packagesz registration.update_contact_infoz$registration.extended_update_supportzregistration.smbiosc Csd}|jd}g}x|D]}ydd|jddD\}}Wntk rPwYnX|jdd\}}|d dkrvtd|dd }||d }|j||fqW|S) N,cSsg|] }|jqS)strip).0ir r "/usr/lib/python3.6/capabilities.py #szparseCap..=()z2something broke in parsing the capabilited headers)rvaluer)split ValueErrorprintappend) Z capstringrZcapscapslistcapZ key_versionkeyrdatar r rparseCaps     rc@sNeZdZddZddZddZddZd d Zd d Zd dZ dddZ dS) CapabilitiescCs&tjj|i|_t|_tj|_dS)N)UserDict__init__ missingCaps neededCapsrZinitUp2dateConfigcfg)selfr r rr!:s zCapabilities.__init__cCsJxD|jD]8\}}|jdkr t|}x|D]\}}||j|<q,Wq WdS)Nzx-rhn-server-capability)itemslowerrr)r%Zheadersrvalrrrr r rpopulateCs  zCapabilities.populatecCsx|jd}|dkrF|jd}|d}|d}tt|t|d}|S|jd}t|dkrndd|D}|St|gS)N-rr:cSsg|] }t|qSr )int)r ar r rrWsz0Capabilities.parseCapVersion..)findrranger,len)r%Z versionStringindexrngstartendZversionsZversr r rparseCapVersionKs    zCapabilities.parseCapVersioncCsZ||jkr"td|}d|j|<n4|j|}t|d|j|dkrV|j||j|<dS)NzXThis client requires the server to support %s, which the current server does not supportr)r_r"r,r5r#)r%rZcapvalueZerrstrrr r r validateCap\s   zCapabilities.validateCapcCs2x$|jjD]}|j||j|q W|jdS)N)r#keysr7workaroundMissingCaps)r%rr r rvalidatehszCapabilities.validatecCs,||jkrd|j|<|j|=n d|j|<dS)Nrr)tmpCapsr$)r%rZ configItemr r r setConfigns   zCapabilities.setConfigc CsZ|j|_d}||jkr |j|=ndddddddd }x |jD]}|j|||q>Wg}g}t|jrx>|jD]4}|j|}|dkr|j||fqp|j||fqpWd }g}t|rxH|D]@\}}|d ||d |j|d f}|j|||j|d qWt|r@x0|D](\}}|d|}|j||d d qWt|rVtj||dS)NrrZsupportsFinishMessageZsupportsUpdateContactInfoZsupportsDeltaPackagesZsupportsExtendedPackageProfileZ supportsEUSZsupportsSMBIOS)rzregistration.finish_messagez registration.update_contact_infozregistration.delta_packagesz xmlrpc.packages.extended_profilez$registration.extended_update_supportzregistration.smbiosz3Needs %s of version: %s but server has version: %s r)ZcapNamecapInfoZ serverVersionz5Needs %s but server does not support that capability ) r"r;r8r<r0rrrZServerCapabilityError) r%rZ capsConfigMapr"ZwrongVersionCapsrr>Z errStringZ errorListr r rr9usF         z"Capabilities.workaroundMissingCapsNcCs:||jkrdS|r6|j|}t||j|dkr6dSdS)aChecks if the server supports a capability and optionally a version. Returns True or False. This complements the neededCaps mechanism provided by this module. Using hasCapability makes it easier to do something only if the server supports it or to put workaround code in the user of this class. The neededCaps mechanism makes it easier to put workaround code in this module, which makes sense if it is to be shared. 'capability' should be a string such as 'registration.foobar'. It can be a capability in 'neededCaps' above or one that isn't there. 'version' can be a string (where isdigit() is True) or an int. FrT)rr,r5)r%Z capabilityrrr r r hasCapabilitys  zCapabilities.hasCapability)N) __name__ __module__ __qualname__r!r)r5r7r:r<r9r?r r r rr9s  s(