a B:f@s*ddlmZddlZddlZddlmZz ddlZWne yNddlZYn0ddl m Z ddl m Z mZmZmZddlZGdddejZGdd d ejZGd d d eeeZed d dedddedddedddedddedddedddedddGdddeZedZed d dedd ded!d"dedd#dedd$ded%d&deddded'd(dedddGd)d*d*eZed d dedd+dedd,ded-d.dedddGd/d0d0eZed d dedd1ded2d3ded4d5deddded-d6dedddedd7ded8d9ded:d;dGdded2d3ded4d?ded'd@deddAdedddGdBdCdCeZed d deddDdedEdFdedddGdGdHdHeZed d dedIdJdedKdLdedMdNdedOdPdedQdRdedSdTdedUdVdedWdXdedYdZdedd[dGd\d]d]eZed^d_ded`dadedbd$dGdcddddeZ ed dededdfdedgdhdedidjdedddedd[dGdkdldleZ!ed dededmdndedodpdedqdrdedsdtdedudvdedddedd[dGdwdxdxeZ"GdydzdzeZ#ed d dedd ded{d|dedd}dedddedddGd~ddeZ$e%dkr&dS))ABCMetaN)with_metaclass) WHITESPACE) get_classdefault_property ErrorNumberLsmErrorc@seZdZdZddZdS) DataEncoderz? Custom json encoder for objects derived form ILsmData cCs,t|ts tdtt|n|SdS)Nzincorrect class type:) isinstanceIData ValueErrorstrtype_to_dict)selfZmy_classr//usr/lib64/python3.9/site-packages/lsm/_data.pydefault s zDataEncoder.defaultN)__name__ __module__ __qualname____doc__rrrrrr sr c@sBeZdZdZeddZeddZeddZej fdd Z d S) DataDecoderz? Custom json decoder for objects derived from ILsmData cCs<i}d|vrt|}n |D]\}}t|||<q |S)z( Processes a dictionary class)r _factoryitemsr_DataDecoder__decode)drckvrrrZ__process_dict,s  zDataDecoder.__process_dictcCs`g}t|D]N\}}t|tur2|t|q t|turP|t|q ||q |S)z" Processes a list ) enumeraterlistappendr_DataDecoder__process_listdict_DataDecoder__process_dict)lrelemvaluerrrZ__process_list;s   zDataDecoder.__process_listcCs4t|turt|St|tur,t|S|SdS)z) Decodes the parsed json N)rr%rr&r"r$)errrZ__decodeJs     zDataDecoder.__decodecCstt|SN)rrjsonloads)rZ json_stringZ_wrrrdecodeVszDataDecoder.decodeN) rrrr staticmethodr&r$rrmatchr.rrrrr's   rc@s,eZdZdZddZeddZddZdS) r z? Base class functionality of serializable classes. cCsXd|jji}t|jD]8\}}t|trB|||dd<q|||dd<q|S)z5 Represent the class as a dictionary rN) __class__rr"__dict__rr r r)rrrr rrrr`s   zIData._to_dictcCsd|vr|d}|d=ttd|}t|D]F\}}t|trfd|vrft|||d|<q2|||d|<q2|fi|SdS)z Factory for creating the appropriate class given a dictionary. This only works for objects that inherit from IData r._N) rrr"rr r%r rpop)r class_namecrr rrrrpszIData._factorycCs t|S)z7 Used for human string representation. )r rrrrr__str__sz IData.__str__N)rrrrrr/rr:rrrrr Zs  r idzUnique identifier)docnamezDisk name (aka. vendor)Z disk_typezEnumerated type of disk block_sizezSize of each block num_of_blockszTotal number of blocksstatuszEnumerated status system_idzSystem identifierZ plugin_datazPrivate plugin datac@sXeZdZdZddgZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZd ZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+d Z,d Z-d Z.d Z/d Z0dZ1dZ2dZ3dZ4dZ5d Z6dZ7dZ8dZ9dZ:dZ;dZd d!d!e"e&fd"d#Z?e@d$d%ZAe@d&d'ZBe@d(d)ZCe@d*d+ZDe@d,d-ZEd.d/ZFd S)0Diskz Represents a disk. r;rArr1 3456 @i Nc Csj||_||_||_||_||_||_||_||_| rNt | sNt t j d| | |_ | |_| |_| |_dSNz^Incorrect format of VPD 0x83 NAA(3) string: '%s', expecting 32 or 16 lower case hex characters)_id_name _disk_type _block_size_num_of_blocks_status _system_id _plugin_dataVolume vpd83_verifyrrINVALID_ARGUMENT_vpd83 _location_rpm _link_type) rr^r_r`rarbrcrdrerirjrkrlrrr__init__s& z Disk.__init__cCs |j|jS)z% Disk size in bytes. r>r?r9rrr size_bytesszDisk.size_bytescCs|jdkrttjd|jS)z String. SCSI VPD83 ID. New in version 1.3. Only available for DAS(direct attached storage) systems. The VPD83 ID could be used in 'lsm.SCSI.disk_paths_of_vpd83()' when physical disk is exposed to OS directly. r\z5Disk.vpd83 is not supported by current disk or plugin)rirr NO_SUPPORTr9rrrvpd83s  z Disk.vpd83cCs|jdkrttjd|jS)zP String. Disk location in storage topology. New in version 1.3. r\z:Disk.location property is not supported by this plugin yet)rjrrrpr9rrrlocation%s  z Disk.locationcCs|jtjkrttjd|jS)a Integer. New in version 1.3. Disk rotation speed - revolutions per minute(RPM): -1 (LSM_DISK_RPM_UNKNOWN): Unknown RPM 0 (LSM_DISK_RPM_NON_ROTATING_MEDIUM): Non-rotating medium (e.g., SSD) 1 (LSM_DISK_RPM_ROTATING_UNKNOWN_SPEED): Rotational disk with unknown speed >1: Normal rotational disk (e.g., HDD) z,Disk.rpm is not supported by this plugin yet)rkrBRPM_NO_SUPPORTrrrpr9rrrrpm1s  zDisk.rpmcCs|jtjkrttjd|jS)a Integer. New in version 1.3. Link type, possible values are: lsm.Disk.LINK_TYPE_UNKNOWN Failed to detect link type lsm.Disk.LINK_TYPE_FC Fibre Channel lsm.Disk.LINK_TYPE_SSA Serial Storage Architecture, Old IBM tech. lsm.Disk.LINK_TYPE_SBP Serial Bus Protocol, used by IEEE 1394. lsm.Disk.LINK_TYPE_SRP SCSI RDMA Protocol lsm.Disk.LINK_TYPE_ISCSI Internet Small Computer System Interface lsm.Disk.LINK_TYPE_SAS Serial Attached SCSI lsm.Disk.LINK_TYPE_ADT Automation/Drive Interface Transport Protocol, often used by Tape. lsm.Disk.LINK_TYPE_ATA PATA/IDE or SATA. lsm.Disk.LINK_TYPE_USB USB disk. lsm.Disk.LINK_TYPE_SOP SCSI over PCI-E lsm.Disk.LINK_TYPE_PCIE PCI-E, e.g. NVMe z2Disk.link_type is not supported by this plugin yet)rlrBLINK_TYPE_NO_SUPPORTrrrpr9rrr link_typeDs  zDisk.link_typecCs|jSr+r=r9rrrr:jsz Disk.__str__)GrrrrSUPPORTED_SEARCH_KEYSZBLOCK_COUNT_NOT_FOUNDZBLOCK_SIZE_NOT_FOUND TYPE_UNKNOWN TYPE_OTHERZTYPE_ATAZ TYPE_SATAZTYPE_SASTYPE_FCZTYPE_SOPZ TYPE_SCSIZTYPE_LUNZ TYPE_NL_SASZTYPE_HDDZTYPE_SSDZ TYPE_HYBRIDSTATUS_UNKNOWN STATUS_OK STATUS_OTHERSTATUS_PREDICTIVE_FAILURE STATUS_ERRORZSTATUS_REMOVEDZSTATUS_STARTINGZSTATUS_STOPPINGSTATUS_STOPPEDSTATUS_INITIALIZINGZSTATUS_MAINTENANCE_MODEZSTATUS_SPARE_DISKZSTATUS_RECONSTRUCTZ STATUS_FREErsZ RPM_UNKNOWNZRPM_NON_ROTATING_MEDIUMZRPM_ROTATING_UNKNOWN_SPEEDruZLINK_TYPE_UNKNOWNZ LINK_TYPE_FCZ LINK_TYPE_SSAZ LINK_TYPE_SBPZ LINK_TYPE_SRPZLINK_TYPE_ISCSIZ LINK_TYPE_SASZ LINK_TYPE_ADTZ LINK_TYPE_ATAZ LINK_TYPE_USBZ LINK_TYPE_SOPZLINK_TYPE_PCIEZLED_STATUS_UNKNOWNZLED_STATUS_IDENT_ONZLED_STATUS_IDENT_OFFZLED_STATUS_IDENT_UNKNOWNZLED_STATUS_FAULT_ONZLED_STATUS_FAULT_OFFZLED_STATUS_FAULT_UNKNOWNZLINK_SPEED_UNKNOWNZHEALTH_STATUS_UNKNOWNZHEALTH_STATUS_FAILZHEALTH_STATUS_WARNZHEALTH_STATUS_GOODrmpropertyrorqrrrtrvr:rrrrrBs         %rBz*(?:^6[0-9a-f]{31})|(?:^[235][0-9a-f]{15})$zUser given namerqz"Vital product page 0x83 identifierzVolume block sizezNumber of blocksZ admin_statez$Enabled or disabled by administratorpool_idzPool identifierc@s eZdZdZgdZdZdZdZdZdZ dZ dZ dZ dZ d ZdZdZd ZdZdZdZdZd Zd Zd Zd ZdZdZdZdZdZdZdZ d Z!d Z"d Z#d Z$d Z%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dddZ7e8ddZ9ddZ:e;ddZdZAd?ZBd@ZCdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNdLZOdMZPdNZQdOZRdPZSdQZTdRZUdSZVdTZWdUdVZXdgdXdYZYdZd[ZZd\d]Z[e\d^d_Z]dhdadbZ^efdcddZ_dedfZ`dWS)i Capabilitiesrr1rUrrr!"#$%&'()*+,-./0rMrN789:;rr>?rRABdefghijkmnopqrxyz{|cCs |jjddd|jDdS)Nr\cSsg|] }d|qS)z%02xr).0brrr /z)Capabilities._to_dict..)rZcap)r2rr_capr9rrrr,szCapabilities._to_dictNcCs*|durtt||_n ttj|_dSr+) bytearraybinasciiZ unhexlifyr%r_NUM)rr%rrrrm2szCapabilities.__init__cCs||tjkSr+)getr SUPPORTEDr capabilityrrr supported8szCapabilities.supportedcCs|t|jkrtjS|j|Sr+)lenr%r UNSUPPORTEDr+rrrr);szCapabilities.getcCsjt}ttjD]P\}}t|tjrt|t kr|ddkrtj |krXtj krnq|||<q|S)zc Return a dict containing all valid capability: integer => string name rr5) r%r"rr3rr sixZ string_typesrr_CAP_NUM_BEGINr()Zlsm_cap_to_str_convZc_strZc_intrrr_lsm_cap_to_str_dict@s   z!Capabilities._lsm_cap_to_str_dictFcCsNt}|r|Si}t|D](}|j|tjkr ||vr ||||<q |S)za Returns a hash of the supported capabilities in the form constant, name )rr2r"keysr%r*)rZall_capZall_capsrrrrr get_supportedNszCapabilities.get_supportedcCs||j|<dSr+)r%)rr,r)rrrset_szCapabilities.setcCs$tt|jD]}tj|j|<qdSr+)ranger.r%rr*)rrrrr enable_allbszCapabilities.enable_all)N)F)arrrr/r*r(r1ZVOLUMESZ VOLUME_CREATEZ VOLUME_RESIZEZVOLUME_REPLICATEZVOLUME_REPLICATE_CLONEZVOLUME_REPLICATE_COPYZVOLUME_REPLICATE_MIRROR_ASYNCZVOLUME_REPLICATE_MIRROR_SYNCZVOLUME_COPY_RANGE_BLOCK_SIZEZVOLUME_COPY_RANGEZVOLUME_COPY_RANGE_CLONEZVOLUME_COPY_RANGE_COPYZ VOLUME_DELETEZ VOLUME_ENABLEZVOLUME_DISABLEZ VOLUME_MASKZ VOLUME_UNMASKZ ACCESS_GROUPSZACCESS_GROUP_CREATE_WWPNZACCESS_GROUP_DELETEZACCESS_GROUP_INITIATOR_ADD_WWPNZACCESS_GROUP_INITIATOR_DELETEZ"VOLUMES_ACCESSIBLE_BY_ACCESS_GROUPZACCESS_GROUPS_GRANTED_TO_VOLUMEZVOLUME_CHILD_DEPENDENCYZVOLUME_CHILD_DEPENDENCY_RMZACCESS_GROUP_CREATE_ISCSI_IQNZ$ACCESS_GROUP_INITIATOR_ADD_ISCSI_IQNZ VOLUME_ISCSI_CHAP_AUTHENTICATIONZVOLUME_RAID_INFOZ VOLUME_THINZ BATTERIESZVOLUME_CACHE_INFOZ!VOLUME_PHYSICAL_DISK_CACHE_UPDATEZ.VOLUME_PHYSICAL_DISK_CACHE_UPDATE_SYSTEM_LEVELZ+VOLUME_WRITE_CACHE_POLICY_UPDATE_WRITE_BACKZ%VOLUME_WRITE_CACHE_POLICY_UPDATE_AUTOZ.VOLUME_WRITE_CACHE_POLICY_UPDATE_WRITE_THROUGHZ,VOLUME_WRITE_CACHE_POLICY_UPDATE_IMPACT_READZ0VOLUME_WRITE_CACHE_POLICY_UPDATE_WB_IMPACT_OTHERZVOLUME_READ_CACHE_POLICY_UPDATEZ,VOLUME_READ_CACHE_POLICY_UPDATE_IMPACT_WRITEZFSZ FS_DELETEZ FS_RESIZEZ FS_CREATEZFS_CLONEZ FILE_CLONEZ FS_SNAPSHOTSZFS_SNAPSHOT_CREATEZFS_SNAPSHOT_DELETEZFS_SNAPSHOT_RESTOREZ"FS_SNAPSHOT_RESTORE_SPECIFIC_FILESZFS_CHILD_DEPENDENCYZFS_CHILD_DEPENDENCY_RMZ%FS_CHILD_DEPENDENCY_RM_SPECIFIC_FILESZ EXPORT_AUTHZEXPORTSZ EXPORT_FSZ EXPORT_REMOVEZEXPORT_CUSTOM_PATHZSYS_READ_CACHE_PCT_UPDATEZSYS_READ_CACHE_PCT_GETZSYS_FW_VERSION_GETZ SYS_MODE_GETZ DISK_LOCATIONZDISK_RPMZDISK_LINK_TYPEZ VOLUME_LEDZPOOLS_QUICK_SEARCHZVOLUMES_QUICK_SEARCHZDISKS_QUICK_SEARCHZACCESS_GROUPS_QUICK_SEARCHZFS_QUICK_SEARCHZNFS_EXPORTS_QUICK_SEARCHZ TARGET_PORTSZTARGET_PORTS_QUICK_SEARCHZDISKSZPOOL_MEMBER_INFOZVOLUME_RAID_CREATEZDISK_VPD83_GETrrmr-r)r/r2r4r5r7rrrrrs   rrzCache hardware typezBattery statusc@sNeZdZddgZdZdZdZdZdZdZ dZ dZ dZ d Z d Zd Zdd dZd S)Batteryr;rAr1rOrDrErIrPrQrRrSNcCs(||_||_||_||_||_||_dSr+)r^r__typercrdre)rr^r_r9rcrdrerrrrm~s zBattery.__init__)N)rrrrxryrzZ TYPE_CHEMICALZTYPE_CAPACITORr|r~r}ZSTATUS_DISCHARGINGZSTATUS_CHARGINGZSTATUS_LEARNINGrrrmrrrrr8gsr8__main__)&abcrZ_ABCMetarr'r0rZ simplejsonr, ImportErrorZ json.decoderrZ lsm._commonrrrrZ JSONEncoderr Z JSONDecoderrobjectr rBrrrfrrrrrrrrrr8rrrrr s      31         ^          "     [         $D                      &!         p         0-