Ñò h'dWc@sLdZddkZddkZddkZddkZddkZddklZddk l Z ddk l Z l Z lZlZlZlZlZlZddklZddklZlZlZlZlZlZlZlZlZlZl Z l!Z!l"Z"l#Z#l$Z$l%Z%l&Z&ddk'l(Z(l)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„Z5he,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 classcCs6t|tƒptdƒ‚nt|iƒ|_dS(Nsdesc must be a dm_desc object(t isinstanceRt TypeErrortvaluet_as_parameter_(tselftdesc((s../__init__.pyt__init__OscCsti|ƒdS(N(R tdm_free_descriptor(R"((s../__init__.pyt__del__XscCsštiƒ}ti|ti|ƒƒ}|idjoI|itijotdƒ‚q€t |idt i |iƒƒ‚n|i}ti |ƒ|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    cCsFti|ƒ}|djo&ttidtitiƒƒ‚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   cCsmti|iƒ}tƒ}d}x?to7||}|djoPn|i|ƒ|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|ƒi}Wntj odSXtiƒ}ti|ti|ƒƒ}|i djoI|i t i jot dƒ‚qªt |i dti|i ƒƒ‚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À|tjoMt|ttifƒotdt|ƒƒ‚qZtd|iiƒ‚nt|tƒo t|p|}||i jo.t d|t||i t|i fƒ‚nt i ƒ}ti||t i|ƒƒ}|idjoI|itijotdƒ‚q<t|idti|iƒƒ‚ntƒ}d}xLtoD||}|idjoPn|it||ƒƒ|d7}qNWtit i|t iƒƒ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Ž|i}d|iit|ƒfg}|id|iƒg}t|ƒidƒdD]}|d|qZ~}|i|ƒdi |ƒS(s__repr__(x) <==> repr(x)s%s <%d>s name = "%s"s is %s( RKRPRQtidR=R5RLtsplittextendtjoin(R"tattrR@t_[1]tlinetastr((s../__init__.pyt__repr__Çs  8 ( RQt __module__t__doc__R$R&tpropertyR5R9RCRKRXRa(((s../__init__.pyRLs   1tDMDrivecBsneZdZeZed„ƒZed„ƒZed„ƒZed„ƒZ ed„ƒZ ed„ƒZ RS(s0A libdiskmgt.so descriptor that is of type DRIVEcCs |itƒS(s/tuple of controllers associated with this drive(RXR (R"((s../__init__.pyt controllers×scCs |itƒS(s)tuple of alias associated with this drive(RXR (R"((s../__init__.pytaliasesÜscCs |itƒS(s)tuple of paths associated with this drive(RXR(R"((s../__init__.pytpathsáscCs0y|itƒdSWntj odSXdS(s(media associated with this drive or NoneiN(RXRt IndexErrorRG(R"((s../__init__.pytmediaæscCsutƒ}ti|iititiBƒ}z ti|t t i |ƒƒWdti |ƒX|i tjotStS(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Øtiƒ}ti|tti|ƒƒ}|idjoI|itijot dƒ‚nt |idt i |iƒƒ‚nt |ƒ}tƒ}x9|iƒD]+\\}}}|i|gƒi|ƒ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     ( RQRbRcRRERdRfRgRhRjRwR}(((s../__init__.pyReÓs t DMControllercBsPeZdZeZed„ƒZed„ƒZed„ƒZed„ƒZ RS(s5A libdiskmgt.so descriptor that is of type CONTROLLERcCsg|idj oS|iitjo@ytd|iƒ}Wntj otƒ}nXt|jSt S(sZ property to indicate if the controller is a floppy drive USB controller. t compatibleN( RKRGRDRRR5t ExceptionR;RRt(R"tdi_props((s../__init__.pytfloppy_controllers cCs|itƒdS(s#bus associated with this controlleri(RXR (R"((s../__init__.pytbus,scCs |itƒS(s.tuple of paths associated with this controller(RXR(R"((s../__init__.pyRh1scCs |itƒS(s/tuple of drives associated with this controller(RXR(R"((s../__init__.pytdrives6s( RQRbRcRRERdR‚RƒRhR„(((s../__init__.pyR~s tDMMediacBsAeZdZeZed„ƒZed„ƒZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type MEDIAcCs|itƒdS(s drive associated with this mediai(RXR(R"((s../__init__.pytdrive@scCs |itƒS(s.tuple of partitions associated with this media(RXR(R"((s../__init__.pyt partitionsEscCs |itƒS(s*tuple of slices associated with this media(RXR(R"((s../__init__.pytslicesJs( RQRbRcRRERdR†R‡Rˆ(((s../__init__.pyR…<s tDMSlicecBsAeZdZeZed„ƒZed„ƒZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type SLICEcCs|itƒdS(s media associated with this slicei(RXR(R"((s../__init__.pyRjTscCs |itƒS(s.tuple of partitions associated with this slice(RXR(R"((s../__init__.pyR‡YscCsØtiƒ}ti|tti|ƒƒ}|idjoI|itijot dƒ‚nt |idt i |iƒƒ‚nt |ƒ}tƒ}x9|iƒD]+\\}}}|i|gƒi|ƒq¥W|S(suse_stats of sliceis#dm_get_stats(): insufficient memorysdm_get_stats(): %s(R'R(R RxRR*R R+R,R-R.R/R0RRyRzR{R=(R"R2RJR8R5R|RB((s../__init__.pyR}`s     ( RQRbRcR RERdRjR‡R}(((s../__init__.pyR‰Ps t DMPartitioncBs#eZdZeZed„ƒZRS(s4A libdiskmgt.so descriptor that is of type PARTITIONcCs|itƒdS(s$media associated with this partitioni(RXR(R"((s../__init__.pyRj~s(RQRbRcRRERdRj(((s../__init__.pyRŠzstDMPathcBs2eZdZeZed„ƒZed„ƒZRS(s/A libdiskmgt.so descriptor that is of type PATHcCs0y|itƒdSWntj odSXdS(s,controller or None associated with this pathiN(RXR RiRG(R"((s../__init__.pyt controllerˆscCs |itƒS(s)tuple of drives associated with this path(RXR(R"((s../__init__.pyR„s(RQRbRcRRERdRŒR„(((s../__init__.pyR‹„stDMAliascBs#eZdZeZed„ƒZRS(s0A libdiskmgt.so descriptor that is of type ALIAScCs|itƒdS(s drive associated with this aliasi(RXR(R"((s../__init__.pyR†šs(RQRbRcRRERdR†(((s../__init__.pyR–stDMBuscBs#eZdZeZed„ƒZRS(s.A libdiskmgt.so descriptor that is of type BUScCs |itƒS(s,list of controllers associated with this bus(RXR (R"((s../__init__.pyRf¤s(RQRbRcRRERdRf(((s../__init__.pyRŽ scCs@|tjoMt|ttifƒotdt|ƒƒ‚qZtd|iiƒ‚nt|tƒo t|p|}t i ƒ}t i ||t i |ƒƒ}|idjo}|itijo!td|t||fƒ‚n|itijotdƒ‚nt|idti|iƒƒ‚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& !  cCs‚|tjoMt|ttifƒotdt|ƒƒ‚qZtd|iiƒ‚nt|tƒo t|p|}t i ƒ}t i |dt i|ƒƒ}|idjoI|itijotdƒ‚nt|idti|iƒƒ‚ntƒ}d}xLtoD||}|idjoPn|it||ƒƒ|d7}qWt it i|t iƒƒ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Ìs4 !    (7RctctypesR'R+RoRMR/tbootmgmt.pysolRt libnvpairRtlibdiskmgt.attributesRRRRRRRR t libdiskmgtR tlibdiskmgt.constR R R RRRRRRRRRRRRRtlibdiskmgt.cstructRRtobjectRReR~R…R‰RŠR‹RRŽR’R”RS(((s../__init__.pyt2s>     :p‡F#*   " (