ó h'dWc@sLdZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZddlmZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'm(Z(m)Z)d e*fd „ƒYZ+d e+fd „ƒYZ,d e+fd„ƒYZ-de+fd„ƒYZ.de+fd„ƒYZ/de+fd„ƒYZ0de+fd„ƒYZ1de+fd„ƒYZ2de+fd„ƒYZ3d„Z4d„Z5ie,e6e-e6e.e6e/e6e0e6e1e6e2e6e3e6Z6dS(s— Python package with ctypes wrapper for libdiskmgt.so (undocumented). This is how everything is related in libdiskmgt.so: DMAlias +--- DMPartition +---+ | | | | | | | | | DMBus --- DMController --- DMDrive --- DMMedia | | | | | | | +---+ | | | | +--- DMPath ---+ +--- DMSlice This means if you have a DMBus object, you can use its get_associated_descriptors() method to get to the DMController. All DM* types are subclasses of DMDescriptor class. All DM* types have attributes and stats property which return objects derived from libnvpair.NVList (which is dictionary like). Start by calling one of the factory functions: descriptor_from_key descriptors_by_type iÿÿÿÿN(t di_find_prop(tNVList(t DMAliasAttrt DMBusAttrtDMControllerAttrt DMDriveAttrt DMMediaAttrt DMPartAttrt DMPathAttrt DMSliceAttr(tcfunc(tALIAStBUSt CONTROLLERtDRIVEtMEDIAt PARTITIONtPATHRtSLICEtDSTAT_DIAGNOSTICt SSTAT_USEt DESC_TYPE_MAPt DESC_TYPEt CTYPE_USBt DI_FLOPPYt DKIOCINFOt DKC_CDROM(tdm_desctDKCinfot DMDescriptorcBsneZdZd„Zd„Zed„ƒZed„ƒZed„ƒZed„ƒZ d„Z d„Z RS( sDMDescriptor Base classcCs4t|tƒstdƒ‚nt|jƒ|_dS(Nsdesc must be a dm_desc object(t isinstanceRt TypeErrortvaluet_as_parameter_(tselftdesc((s __init__.pyt__init__OscCstj|ƒdS(N(R tdm_free_descriptor(R"((s __init__.pyt__del__XscCs–tjƒ}tj|tj|ƒƒ}|jdkr||jtjkrWtdƒ‚q|t |jdt j |jƒƒ‚n|j}tj |ƒ|S(sName of this descriptor, a stris"dm_get_name(): insufficient memorysdm_get_name(): %s( tCtc_intR t dm_get_nametbyrefR terrnotENOMEMt MemoryErrortOSErrortoststrerrort dm_free_name(R"terrtcstrtrstr((s __init__.pytname[s    cCsDtj|ƒ}|dkr@ttjdtjtjƒƒ‚n|S(s0type of this descriptor, one of DESC_TYPE an intiÿÿÿÿsdm_get_type(): %s(R t dm_get_typeR.R+tEBADFR/R0(R"tresult((s __init__.pytdtypels   cCsitj|jƒ}tƒ}d}x;tr^||}|dkrDPn|j|ƒ|d7}q$Wt|ƒS(s:associated types for this descriptor, a tuple of DESC_TYPEiiÿÿÿÿi(R tdm_get_associated_typesR9tlisttTruetappendttuple(R"tintptrlisttidxtval((s __init__.pytassociated_dtypesvs     cCs®yt|ƒj}Wntk r'dSXtjƒ}tj|tj|ƒƒ}|j dkr¤|j t j krt dƒ‚q¤t |j dtj|j ƒƒ‚n||ƒS(s0attributes of this descriptor, an NVList or Noneis(dm_get_attributes(): insufficient memorysdm_get_attributes(): %sN(ttypetATYPEtAttributeErrortNoneR'R(R tdm_get_attributesR*R R+R,R-R.R/R0(R"tatypeR2tnvl((s __init__.pyt attributes„s   cCs°|tkrVt|ttjfƒr=tdt|ƒƒ‚qVtd|jjƒ‚nt|tƒrot|pr|}||j kr±t d|t||j t|j fƒ‚nt j ƒ}tj||t j|ƒƒ}|jdkr0|jtjkr tdƒ‚q0t|jdtj|jƒƒ‚ntƒ}d}xHtr‰||}|jdkrePn|jt||ƒƒ|d7}qBWtjt j|t jƒƒt|ƒS(s— get_associated_descriptors(int or str) -> tuple of DMDescriptor raises AttributeError if dtype not in self.associated_dtypes s dtype: '%s' not in DESC_TYPE_MAPs5dtype: '%s' object is not int or str in DESC_TYPE_MAPs(dtype: %d ('%s') not valid for %d ('%s')is4dm_get_associated_descriptors(): insufficient memorys#dm_get_associated_descriptors(): %si( RRtstrtnumberstIntegralt ValueErrorRt __class__t__name__RCRFR9R'R(R tdm_get_associated_descriptorsR*R R+R,R-R.R/R0R;R<R=t_RESTYPEtdm_free_descriptorstcasttc_void_pR>(R"R9R2tdescpR@RARB((s __init__.pytget_associated_descriptors–s:       cCs†|j}d|jjt|ƒfg}|jd|jƒgt|ƒjdƒdD]}d|^qV}|j|ƒdj |ƒS(s__repr__(x) <==> repr(x)s%s <%d>s name = "%s"s is %s( RKRPRQtidR=R5RLtsplittextendtjoin(R"tattrR@tlinetastr((s __init__.pyt__repr__Çs  0 ( RQt __module__t__doc__R$R&tpropertyR5R9RCRKRXR`(((s __init__.pyRLs   1tDMDrivecBsneZdZeZed„ƒZed„ƒZed„ƒZed„ƒZ ed„ƒZ ed„ƒZ RS(s0A libdiskmgt.so descriptor that is of type DRIVEcCs |jtƒS(s/tuple of controllers associated with this drive(RXR (R"((s __init__.pyt controllers×scCs |jtƒS(s)tuple of alias associated with this drive(RXR (R"((s __init__.pytaliasesÜscCs |jtƒS(s)tuple of paths associated with this drive(RXR(R"((s __init__.pytpathsáscCs.y|jtƒdSWntk r)dSXdS(s(media associated with this drive or NoneiN(RXRt IndexErrorRG(R"((s __init__.pytmediaæs cCsstƒ}tj|jjtjtjBƒ}z tj|t t j |ƒƒWdtj |ƒX|j tkrotStS(s= property to indicate if the drive is a cd-rom drive N(RR/topenRKtopathtO_RDONLYtO_NDELAYtfcntltioctlRR't addressoftcloset dki_ctypeRR<tFalse(R"tdk_cinfotfd((s __init__.pytcdromïs " cCsÔtjƒ}tj|ttj|ƒƒ}|jdkr|jtjkrZt dƒ‚nt |jdt j |jƒƒ‚nt |ƒ}tƒ}x9|jƒD]+\\}}}|j|gƒj|ƒq¡W|S(suse_stats of driveis#dm_get_stats(): insufficient memorysdm_get_stats(): %s(R'R(R t dm_get_statsRR*R R+R,R-R.R/R0Rtdictt iteritemst setdefaultR=(R"R2RJR8R5tdatatypeRB((s __init__.pyt use_statsþs    ( RQRaRbRRERcReRfRgRiRvR|(((s __init__.pyRdÓs t DMControllercBsPeZdZeZed„ƒZed„ƒZed„ƒZed„ƒZ RS(s5A libdiskmgt.so descriptor that is of type CONTROLLERcCsb|jdk r^|jjtkr^ytd|jƒ}Wntk rStƒ}nXt|kSt S(sZ property to indicate if the controller is a floppy drive USB controller. t compatibleN( RKRGRDRRR5t ExceptionR;RRs(R"tdi_props((s __init__.pytfloppy_controllers   cCs|jtƒdS(s#bus associated with this controlleri(RXR (R"((s __init__.pytbus,scCs |jtƒS(s.tuple of paths associated with this controller(RXR(R"((s __init__.pyRg1scCs |jtƒS(s/tuple of drives associated with this controller(RXR(R"((s __init__.pytdrives6s( RQRaRbRRERcRR‚RgRƒ(((s __init__.pyR}s tDMMediacBsAeZdZeZed„ƒZed„ƒZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type MEDIAcCs|jtƒdS(s drive associated with this mediai(RXR(R"((s __init__.pytdrive@scCs |jtƒS(s.tuple of partitions associated with this media(RXR(R"((s __init__.pyt partitionsEscCs |jtƒS(s*tuple of slices associated with this media(RXR(R"((s __init__.pytslicesJs( RQRaRbRRERcR…R†R‡(((s __init__.pyR„<s tDMSlicecBsAeZdZeZed„ƒZed„ƒZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type SLICEcCs|jtƒdS(s media associated with this slicei(RXR(R"((s __init__.pyRiTscCs |jtƒS(s.tuple of partitions associated with this slice(RXR(R"((s __init__.pyR†YscCsÔtjƒ}tj|ttj|ƒƒ}|jdkr|jtjkrZt dƒ‚nt |jdt j |jƒƒ‚nt |ƒ}tƒ}x9|jƒD]+\\}}}|j|gƒj|ƒq¡W|S(suse_stats of sliceis#dm_get_stats(): insufficient memorysdm_get_stats(): %s(R'R(R RwRR*R R+R,R-R.R/R0RRxRyRzR=(R"R2RJR8R5R{RB((s __init__.pyR|`s    ( RQRaRbR RERcRiR†R|(((s __init__.pyRˆPs t DMPartitioncBs#eZdZeZed„ƒZRS(s4A libdiskmgt.so descriptor that is of type PARTITIONcCs|jtƒdS(s$media associated with this partitioni(RXR(R"((s __init__.pyRi~s(RQRaRbRRERcRi(((s __init__.pyR‰zstDMPathcBs2eZdZeZed„ƒZed„ƒZRS(s/A libdiskmgt.so descriptor that is of type PATHcCs.y|jtƒdSWntk r)dSXdS(s,controller or None associated with this pathiN(RXR RhRG(R"((s __init__.pyt controllerˆs cCs |jtƒS(s)tuple of drives associated with this path(RXR(R"((s __init__.pyRƒs(RQRaRbRRERcR‹Rƒ(((s __init__.pyRŠ„stDMAliascBs#eZdZeZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type ALIAScCs|jtƒdS(s drive associated with this aliasi(RXR(R"((s __init__.pyR…šs(RQRaRbRRERcR…(((s __init__.pyRŒ–stDMBuscBs#eZdZeZed„ƒZRS(s.A libdiskmgt.so descriptor that is of type BUScCs |jtƒS(s,list of controllers associated with this bus(RXR (R"((s __init__.pyRe¤s(RQRaRbRRERcRe(((s __init__.pyR scCs4|tkrVt|ttjfƒr=tdt|ƒƒ‚qVtd|jjƒ‚nt|tƒrot|pr|}t j ƒ}t j ||t j |ƒƒ}|jdkr&|jtjkràtd|t||fƒ‚n|jtjkrtdƒ‚nt|jdtj|jƒƒ‚nt||ƒS(s} descriptor_from_name(int or str, str) -> DMDescriptor object raises KeyError if the descriptor does not exist. s dtype: '%s' not in DESC_TYPE_MAPs5dtype: '%s' object is not int or str in DESC_TYPE_MAPis(%d '%s', '%s')s0dm_get_descriptor_by_name(): insufficient memorysdm_get_descriptor_by_name(): %s(RRRLRMRNRORRPRQR'R(R tdm_get_descriptor_by_nameR*R R+tENODEVtKeyErrorR,R-R.R/R0RS(R9R5R2R#((s __init__.pytdescriptor_from_keyªs&   cCst|tkrVt|ttjfƒr=tdt|ƒƒ‚qVtd|jjƒ‚nt|tƒrot|pr|}t j ƒ}t j |dt j|ƒƒ}|jdkrô|jtjkrÏtdƒ‚nt|jdtj|jƒƒ‚ntƒ}d}xHtrM||}|jdkr)Pn|jt||ƒƒ|d7}qWt jt j|t jƒƒt|ƒS(s@descriptors_by_type(int or str) -> tuple of DMDescriptor objectss dtype: '%s' not in DESC_TYPE_MAPs5dtype: '%s' object is not int or str in DESC_TYPE_MAPis)dm_get_descriptors(): insufficient memorysdm_get_descriptors(): %siN(RRRLRMRNRORRPRQR'R(R tdm_get_descriptorsRGR*R R+R,R-R.R/R0R;R<R=RSRTRURVR>(R9R2RWR@RARB((s __init__.pytdescriptors_by_typeÌs2      (7RbtctypesR'R+RnRMR/tbootmgmt.pysolRt libnvpairRtlibdiskmgt.attributesRRRRRRRR t libdiskmgtR tlibdiskmgt.constR R R RRRRRRRRRRRRRtlibdiskmgt.cstructRRtobjectRRdR}R„RˆR‰RŠRŒRR‘R“RS(((s __init__.pyt2s>     :p‡F#*   " (