Mini Shell

Direktori : /lib/python3.6/site-packages/blivet/devices/__pycache__/
Upload File :
Current File : //lib/python3.6/site-packages/blivet/devices/__pycache__/storage.cpython-36.opt-1.pyc

3

{)c�|�@s�ddlZddlZddlZddlmZddlmZddlmZddlmZddlm	Z	ddlm
Z
dd	lmZm
Z
dd
lmZddlZejd�Zdd
lmZddlmZddlmZddlmZGdd�de�ZdS)�N�)�	callbacks)�errors)�util)�flags)�log_method_call)�udev)�
get_format�DeviceFormat)�Size�blivet�)�Device)�NetworkStorageDevice)�LINUX_SECTOR_SIZE)�LUKS_METADATA_SIZEcsteZdZdZdZdZdZdZdZdZ	dZ
dZddiZd��fd	d
�	Z
�fdd�Ze�fd
d��Zedd��Zedd��Zedd��Zedd��Zedd��Zejdd��Z�fdd�Zdd�Zdd�Zd d!�Zed"d#�d$d#�d%d&�Zd'd(�Ze�fd)d*��Zed+d,��Zd-d.�Zed/d0��Z ed1d2��Z!ed3d4��Z"d5d6�Z#d�d7d8�Z$ed9d:��Z%e%jd;d:��Z%ed<d=��Z&e&jd>d=��Z&d�d?d@�Z'd�dAdB�Z(d�dCdD�Z)dEdF�Z*d�dGdH�Z+d�dIdJ�Z,d�dKdL�Z-d�dMdN�Z.dOdP�Z/dQdR�Z0dSdT�Z1dUdV�Z2dWdX�Z3dYdZ�Z4d[d\�Z5d]d^�Z6d�d_d`�Z7d�dbdc�Z8d�ddde�Z9dfdg�Z:dhdi�Z;edjd#�dkd#�dld&�Z<dmdn�Z=edodp��Z>d�dqdr�Z?edsdt��Z@edudv��ZAedwdx��ZBdydz�ZCed{d|��ZDed}d~��ZEdd��ZFd�d��ZGd�d��ZHed�d#�d�d#�d�d&�ZId�d�d��ZJed�d���ZKed�d���ZLed�d���ZMed�d���ZNed�d���ZOed�d���ZPed�d���ZQed�d���ZRed�d���ZSed�d���ZTd�d��ZUd�d��ZV�ZWS)��
StorageDevicea A generic storage device.

        A fully qualified path to the device node can be obtained via the
        path attribute, although it is not guaranteed to be useful, or
        even present, unless the StorageDevice's setup method has been
        run.
    Frz/dev�name�_renameN�csdt|t�r|g}|	|_||_||_td�|_|jrr|rr|jrrtt	j
|�|j�}|t	j
|�krrtjd|||�|}t
t	j
|��|_|j|_|jr�|jnt
d�|_t	j
|�|_t	j
|�|_|
|_|p�d|_|p�d|_|
|_d|_d|_d|_|jo�|j|��rtd|��tt|�j||d�||_t j!|j�|_"d|_#g|_$|j�r`|j%�r`|j&�|j'�dS)	a�
            :param name: the device name (generally a device node's basename)
            :type name: str
            :keyword exists: does this device exist?
            :type exists: bool
            :keyword size: the device's size
            :type size: :class:`~.size.Size`
            :keyword parents: a list of parent devices
            :type parents: list of :class:`StorageDevice`
            :keyword fmt: this device's formatting
            :type fmt: :class:`~.formats.DeviceFormat` or a subclass of it
            :keyword uuid: universally unique identifier (device -- not fs)
            :type uuid: str
            :keyword sysfs_path: sysfs device path
            :type sysfs_path: str
            :keyword major: the device major
            :type major: int
            :keyword minor: the device minor
            :type minor: int
            :keyword serial: the ID_SERIAL_SHORT for this device
            :type serial: str
            :keyword vendor: the manufacturer of this Device
            :type vendor: str
            :keyword model: manufacturer's device model string
            :type model: str
            :keyword bus: the interconnect this device uses
            :type bus: str

        NzB%s: using size %s instead of %s to accommodate format minimum sizerrFTz&%s is not a valid name for this device)�parents)(�
isinstancer�exists�uuid�
sysfs_pathr	�_format�min_size�maxrZnumeric_type�log�infor�_size�_target_size�
_current_size�major�minor�_serial�_vendor�_model�bus�	_readonly�
_protected�
_controllable�
is_name_valid�
ValueError�superr�__init__�format�copy�deepcopy�original_formatZ
fstab_commentZdevice_links�status�update_sysfs_path�update_size)�selfr�fmtr�sizer#r$rrr�serial�vendor�modelr(r)�	__class__��/usr/lib/python3.6/storage.pyr/CsF"




zStorageDevice.__init__csBd}|jsd}d||jtt|�j�f}|jjr>|d|j7}|S)NZexistingznon-existentz%s %s %sz with %s)rr9r.r�__str__r0�type)r7Zexist�s)r=r>r?r@�szStorageDevice.__str__cs,tt|�j��j�fdd�|jjD���S)Nc3s|]}|�kr|VqdS)Nr>)�.0�p)�packagesr>r?�	<genexpr>�sz)StorageDevice.packages.<locals>.<genexpr>)r.rrE�extendr0)r7)r=)rEr?rE�szStorageDevice.packagescsLg�x(|jD]}�j�fdd�|jD��qW|jrH|jjrH�j|��S)z? A list of all disks this device depends on, including itself. c3s|]}|�kr|VqdS)Nr>)rC�d)�_disksr>r?rF�sz&StorageDevice.disks.<locals>.<genexpr>)rrG�disks�is_diskr0Zhidden�append)r7�parentr>)rIr?rJ�s
zStorageDevice.diskscCs|jptdd�|jD��S)z8 True if this device, or any it requires, is encrypted. css|]}|jVqdS)N)�	encrypted)rCrDr>r>r?rF�sz*StorageDevice.encrypted.<locals>.<genexpr>)�
_encrypted�anyr)r7r>r>r?rN�szStorageDevice.encryptedcCs|S)z; The device itself, or when encrypted, the backing device. r>)r7r>r>r?�
raw_device�szStorageDevice.raw_devicecCs>|js|jr|jdjStStj|jd�}|r6t|�StSdS)z, Logical sector (block) size of this device rzqueue/logical_block_sizeN)rr�sector_sizerr�get_sysfs_attrr�int)r7Z
block_sizer>r>r?rR�szStorageDevice.sector_sizecCs|jotjo|j�S)N)r+rZtestingZunavailable_type_dependencies)r7r>r>r?�controllable�szStorageDevice.controllablecCs
||_dS)N)r+)r7�valuer>r>r?rU�scs>||jkrdStt|�j|�t|d�r:|jjr:|j|j_dS)z�Set the device's name.

        :param value: the new device name
        :raises errors.DeviceError: if the device exists
        Nr)�_namer.r�	_set_name�hasattrr0�device�path)r7rV)r=r>r?rX�s

zStorageDevice._set_namecCs|S)z� Return a proposed target size adjusted for device specifics.

            :param :class:`~.Size` newsize: the proposed/unaligned target size
            :returns: newsize modified to yield an aligned device
            :rtype: :class:`~.Size`
        r>)r7�newsizer>r>r?�align_target_size�szStorageDevice.align_target_sizecCs|jS)N)r!)r7r>r>r?�_get_target_size�szStorageDevice._get_target_sizecCs�t|t�std��|jr<||jkr<tjd||j�td��n(|jrd||jkrdtjd||j�td��|j|�|krztd��||_dS)Nznew size must of type Sizez+requested size %s is larger than maximum %sz/size is larger than the maximum for this devicez,requested size %s is smaller than minimum %sz0size is smaller than the minimum for this devicez-new size would violate alignment requirements)	rrr-�max_sizer�errorrr]r!)r7r\r>r>r?�_set_target_size�s



zStorageDevice._set_target_sizecCs|j�S)N)r^)rBr>r>r?�<lambda>szStorageDevice.<lambda>cCs
|j|�S)N)ra)rB�vr>r>r?rb
szTarget size of this device)�doccCsNtj|�}|d|j|j|j|j|j|j|j|j	|j
|j|j|j
jd�7}|S)Na  uuid = %(uuid)s  size = %(size)s
  format = %(format)s
  major = %(major)s  minor = %(minor)s  exists = %(exists)s  protected = %(protected)s
  sysfs path = %(sysfs)s
  target size = %(target_size)s  path = %(path)s
  format args = %(format_args)s  original_format = %(orig_fmt)s)rr0r9r#r$r�sysfs�target_sizer[�	protected�format_argsZorig_fmt)r�__repr__rr0r9r#r$rrrfr[rgrhr3rA)r7rBr>r>r?ris
zStorageDevice.__repr__csFtt|�j}|j|j|j|jj|j|j|j	|j
|j|j|j
d�
�|S)N)
rr9r0�	removabler#r$rrerfr[)r.r�dict�updaterr9r0rjr#r$rrrfr[)r7rH)r=r>r?rk!s
zStorageDevice.dictcCsd|j|jfS)z' Device node representing this device. z%s/%s)�_dev_dirr)r7r>r>r?r[+szStorageDevice.pathcCs�t||jtjj|j�d�|js*tjd��ytjj	t
j|j�}WnBtjt
ttfk
r�}ztjd|j|�d|_WYdd}~XnX|j|_tjd|j|j�dS)z" Update this device's sysfs path. )r4zdevice has not been createdz&failed to update sysfs path for %s: %srNz%s sysfs_path set to %s)rr�osr[rr�DeviceError�pyudevZDevicesZfrom_device_filerZglobal_udevZDeviceNotFoundError�EnvironmentErrorr-�OSErrorrr`rZsys_path�debug)r7Zudev_device�er>r>r?r50s

zStorageDevice.update_sysfs_pathcCsgS)z7 Device-specific arguments to format creation program. r>)r7r>r>r?rhFszStorageDevice.format_argscCs|jo|jo|jjp|jjS)z Can this device be resized? )�
_resizablerr0�	resizable)r7r>r>r?rvKszStorageDevice.resizablecCs$|j}|jr |jjr d|jj}|S)NzUUID=%s)r[r0r)r7�specr>r>r?�
fstab_specQszStorageDevice.fstab_speccCs*|jrtd|j��ntjd|j��dS)a Resize a device to self.target_size.

            This method should only be invoked via the
            ActionResizeDevice.execute method. All the pre-conditions
            enforced by ActionResizeDevice.__init__ are assumed to hold.

            Returns nothing.
        z)method not implemented for device type %szdevice type %s is not resizableN)ru�NotImplementedErrorrArro)r7r>r>r?�resizeXs	zStorageDevice.resizecCs*|jstjd|j��ntd|j��dS)a� Rename this device.

            :param old_name: current name of this device
            :type old_name: str
            :param new_name: new name for this device
            :type new_name: str
            :param dry_run: whether to only run checks and not perform the rename
            :type dry_run: bool

            Note: This method should only be invoked via the
                  ActionConfigureDevice.execute method. All the pre-conditions
                  enforced by ActionConfigureDevice.__init__ are assumed to hold.
                  self.name value is chaged by the ActionConfigureDevice.apply method.

                  Caller must make sure the name is unique, this method cannot check
                  the name uniqueness.
        zdevice type %s is not renamablez)method not implemented for device type %sN)�
_renamablerrorAry)r7Zold_name�new_nameZdry_runr>r>r?rfszStorageDevice._renamecCs|jptdd�|jD��S)Ncss|]}|jVqdS)N)�readonly)rCrDr>r>r?rF�sz)StorageDevice.readonly.<locals>.<genexpr>)r)rPr)r7r>r>r?r}}szStorageDevice.readonlycCs
||_dS)N)r))r7rVr>r>r?r}�scCs|jp
|jS)N)r}r*)r7r>r>r?rg�szStorageDevice.protectedcCs
||_dS)N)r*)r7rVr>r>r?rg�scCs2|jstjd��|js|jr"dS|j|d�dS)z� Preparation and pre-condition checking for device setup.

            Return True if setup should proceed or False if not.
        zdevice has not been createdF)�origT)rrror4rU�
setup_parents)r7r~r>r>r?�
_pre_setup�s
zStorageDevice._pre_setupcCsdS)z+ Perform device-specific setup operations. Nr>)r7r~r>r>r?�_setup�szStorageDevice._setupcCs@t||j||j|jd�|j|d�s(dS|j|d�|j�dS)z Open, or set up, a device. )r~r4rU)r~N)rrr4rUr�r��_post_setup)r7r~r>r>r?�setup�s
zStorageDevice.setupcCs*tj�|j�|jtd�kr&|j�dS)z  Perform post-setup operations. rN)r�settler5r rr6)r7r>r>r?r��szStorageDevice._post_setupcCsZ|jr|rtjd��|js.|js.|jr2dS|jjrD|jj�|jjrV|jj�dS)z� Preparation and pre-condition checking for device teardown.

            Return True if teardown should proceed or False if not.
        zdevice has not been createdFT)	rrror4rUrgr3�teardownr0)r7�	recursiver>r>r?�
_pre_teardown�s


zStorageDevice._pre_teardowncCsdS)z. Perform device-specific teardown operations. Nr>)r7r�r>r>r?�	_teardown�szStorageDevice._teardowncCsRt||j|j|jd�|j|d�s6|r2|j|d�dS|j|d�|j|d�dS)z  Close, or tear down, a device. )r4rU)r�N)rrr4rUr��teardown_parentsr��_post_teardown)r7r�r>r>r?r��s
zStorageDevice.teardowncCs|r|j|d�dS)z# Perform post-teardown operations. )r�N)r�)r7r�r>r>r?r��szStorageDevice._post_teardowncCs|jrtjd��|j�dS)z= Preparation and pre-condition checking for device creation. zdevice has already been createdN)rrror)r7r>r>r?�_pre_create�s
zStorageDevice._pre_createcCsdS)z, Perform device-specific create operations. Nr>)r7r>r>r?�_create�szStorageDevice._createcCs.t||j|jd�|j�|j�|j�dS)z Create the device. )r4N)rrr4r�r��_post_create)r7r>r>r?�create�szStorageDevice.createcCs2d|_|j�|j�tj�|j�|j�dS)z! Perform post-create operations. TN)rr�r5rr�r6�_update_netdev_mount_option)r7r>r>r?r��szStorageDevice._post_createcCs2|jstjd��|js&tjd|j��|j�dS)z? Preparation and precondition checking for device destruction. zdevice has not been createdz!Cannot destroy non-leaf device %sN)rrro�isleafrr�)r7r>r>r?�_pre_destroy�s

zStorageDevice._pre_destroycCsdS)z1 Perform device-specific destruction operations. Nr>)r7r>r>r?�_destroy	szStorageDevice._destroycCs.t||j|jd�|j�|j�|j�dS)z Destroy the device. )r4N)rrr4r�r��
_post_destroy)r7r>r>r?�destroyszStorageDevice.destroycCs
d|_dS)z& Perform post-destruction operations. FN)r)r7r>r>r?r�szStorageDevice._post_destroycCsVt||j|d�x@|jD]6}|j|d�|r4|j}n|j}|jr|jr|j�qWdS)z) Run setup method of all parent devices. )rr~)r~N)rrrr�r3r0rAr)r7r~rMrr>r>r?rszStorageDevice.setup_parentsTcCsx|jD]}|j|�qWdS)a Perform actions related to removing a device from the devicetree.

            :keyword bool modparent: whether to account for removal in parents

            Parents' list of child devices is updated regardless of modparent.
            The intended use of modparent is to prevent doing things like
            removing a parted.Partition from the disk that contains it as part
            of msdos extended partition management. In general, you should not
            override the default value of modparent in new code.
        N)rZremove_child)r7Z	modparentrMr>r>r?�remove_hook)szStorageDevice.remove_hookcCs"|sx|jD]}|j|�qWdS)a� Perform actions related to adding a device to the devicetree.

            :keyword bool new: whether this device is new to the devicetree

            The only intended use case for new=False is when unhiding a device
            from the devicetree. Additional operations are performed when new is
            False that are normally performed as part of the device constructor.
        N)rZ	add_child)r7�newrDr>r>r?�add_hook7s	zStorageDevice.add_hookcCs*|j}|jr&|jr&|jtd�kr&|j}|S)z8 Get the device's size, accounting for pending changes. r)r rrvrfr)r7r9r>r>r?�	_get_sizeGszStorageDevice._get_sizecCspt|t�std��|jsf|jj}|jj}|rH||krHtjd||j	��n|rf||krftjd||j	��||_
dS)z� Set the device's size to a new value.

            This is not adequate to set up a resize as it does not set a new
            target size for the device.
        znew size must of type Sizezdevice cannot be larger than %sz device cannot be smaller than %sN)rrr-rr0r_rrrorr )r7r\r_rr>r>r?�	_set_sizeOs
zStorageDevice._set_sizecCs|j�S)N)r�)�xr>r>r?rbhscCs
|j|�S)N)r�)r��yr>r>r?rbisz1The device's size, accounting for pending changescCsft||j|j|jd�td�}|jrbtjj|j�rbtjj|j�rbttj	|jd�pRd�}t|t
�}|S)N)rr[rrr9�0)rrr[rrrn�isdirrTrrSr)r7r9Zblocksr>r>r?�read_current_sizels
zStorageDevice.read_current_sizecCs|jtd�kr|j�|_|jS)z� The device's actual size, generally the size discovered by using
            system tools. May use a cached value if the information is
            currently unavailable.

            If the device does not exist, then the actual size is 0.
        r)r"rr�)r7r>r>r?�current_sizews
zStorageDevice.current_sizecCsX|dkrtd�|_nt|t�r&||_ntd��|j}||_||_tjd|j	|j
|�dS)ae Update size, current_size, and target_size to actual size.

            :keyword :class:`~.size.Size` newsize: new size for device

            .. note::

                Most callers will not pass a new size. It is for special cases
                like outside resize of inactive LVs, which precludes updating
                the size from /sys.
        Nrz*new size must be an instance of class Sizezupdated %s size to %s (%s))rr"rr-r�r r!rrsrr9)r7r\Znew_sizer>r>r?r6�s
zStorageDevice.update_sizecCsP|jjdkr2|jr2|jr*|jdjt}qL|j}n|jrF|j|jj�n|j}|S)z& The minimum size this device can be. Zluksr)r0rA�childrenrvrrr�r])r7rr>r>r?r�szStorageDevice.min_sizecCs|jr|j|jj�S|jS)z& The maximum size this device can be. )rvr]r0r_r�)r7r>r>r?r_�szStorageDevice.max_sizecCs t|dd�ptdd�|jD��S)z< True if this device or its component devices are growable. Zreq_growFcss|]}|jVqdS)N)�growable)rCrDr>r>r?rF�sz)StorageDevice.growable.<locals>.<genexpr>)�getattrrPr)r7r>r>r?r��szStorageDevice.growablecCs8|jjr|j|jjkrdS|jjr4|j|jjkr4dSdS)z� Check to make sure the size of the device is allowed by the
            format used.

            Returns:
            0  - ok
            1  - Too large
            -1 - Too small
        r
r���)r0r_r9r)r7r>r>r?�
check_size�s
	zStorageDevice.check_sizecCsdS)z, True if this device contains usable media. Tr>)r7r>r>r?�
media_present�szStorageDevice.media_presentcCs|js
dStj|jtj�S)z� This device's status.

            For now, this should return a boolean:
                True    the device is open and ready for use
                False   the device is not open
        F)rrn�accessr[�W_OK)r7r>r>r?r4�szStorageDevice.statuscCs�|std|j|jd�}t|t�s(td��t||j|jt	|j
dd�d�|js�|jrj|j|jkrjt
jd��nB|jr�|j|jkr�|jr�tjd|j|j|j�|j|_n
t
jd��|j
|kr�tj||j
d	�||_
|j|j
_|j�tj||j
d	�dS)
a� Set the Device's format.

            :param fmt: the new format or None
            :type fmt: :class:`~.formats.DeviceFormat` or NoneType

            A value of None will effectively mark the device as unformatted,
            but this is accomplished by setting it to an instance of the base
            :class:`~.formats.DeviceFormat` class.

            .. note::
                :attr:`format` should always be an instance of
                :class:`~.formats.DeviceFormat`. To ensure this continues to be
                the case, all subclasses that define their own :attr:`format`
                setter should call :meth:`StorageDevice._set_format` from their
                setter.

        N)rZrz&format must be a DeviceFormat instancerA)rAZcurrentz"device is too large for new formatzB%s: using size %s instead of %s to accommodate format minimum sizez"device is too small for new format)rZr8)r	r[rrr
r-rrrAr�rr_r9rrorr�rrrZformat_removedrZr�Zformat_added)r7r8r>r>r?�_set_format�s*




zStorageDevice._set_formatcCs�t|jd�sdSd}|jjjd�}|jjjd�}tdd�|jD��}||k}|rx|rx||krx|j|�dj|�|j_n"|r�|r�|j	|�dj|�|j_dS)zA Fix mount options to include or exclude _netdev as appropriate. �
mountpointNZ_netdev�,css|]}t|t�VqdS)N)rr)rC�ar>r>r?rF
sz<StorageDevice._update_netdev_mount_option.<locals>.<genexpr>)
rYrZoptions�splitZ_user_mountoptsrPZ	ancestors�remove�joinrL)r7Z
netdev_optionZoption_listZuser_optionsZ	is_netdevZhas_netdev_optionr>r>r?r�s


z)StorageDevice._update_netdev_mount_optioncCs|jS)a� Get the device's format instance.

            :returns: this device's format instance
            :rtype: :class:`~.formats.DeviceFormat`

            .. note::
                :attr:`format` should always be an instance of
                :class:`~.formats.DeviceFormat`. Under no circumstances should
                a programmer directly set :attr:`_format` to any other type.

        )r)r7r>r>r?�_get_formatszStorageDevice._get_formatcCs|j�S)N)r�)rHr>r>r?rb%scCs
|j|�S)N)r�)rH�fr>r>r?rb&szThe device's formatting.cCsdS)z$ Do any necessary pre-commit fixups.Nr>)r7Zcurrent_fmtr>r>r?�pre_commit_fixup)szStorageDevice.pre_commit_fixupcCs|jp
|jS)z: Is it possible to execute format actions on this device? )�_format_immutablerg)r7r>r>r?�format_immutable,szStorageDevice.format_immutablecCsRtjj|j�}tjjd|�}|joPtjj|�oPtj|tj�oPt|�j�j	�dkS)Nz%s/removable�1)
rnr[�normpathrrr��R_OK�open�readline�strip)r7ZdevpathZremfiler>r>r?rj4s
zStorageDevice.removablecCs|jS)z% Is this device directly accessible? )r�)r7r>r>r?�direct<szStorageDevice.directcCs|jS)N)�_is_disk)r7r>r>r?rKAszStorageDevice.is_diskcCs4|js |jjdkot|j�dkStdd�|jD��S)Nrcss|]}|jdko|jVqdS)�	partitionN)rAZis_magic)rCrDr>r>r?rFJsz)StorageDevice.is_empty.<locals>.<genexpr>)�partitionedr0rA�lenr��all)r7r>r>r?�is_emptyEszStorageDevice.is_emptycCs|jS)N)�_partitionable)r7r>r>r?�
partitionableLszStorageDevice.partitionablecCs|jjdko|jS)NZ	disklabel)r0rAr�)r7r>r>r?r�PszStorageDevice.partitionedcCs|jS)N)r%)r7r>r>r?r:TszStorageDevice.serialcCs|jS)N)r')r7r>r>r?r<XszStorageDevice.modelcCs|jS)N)r&)r7r>r>r?r;\szStorageDevice.vendorcCsP|jj|�|jjdkr,|jjd�r,d|_|jjd�rL|jt|j�7_dS)NZbtrfszbtrfs.�.)r0�populate_ksdatarA�
startswithr��endswith�str�id)r7�datar>r>r?r�`s
zStorageDevice.populate_ksdatacsN|jd�r&t�fdd�|jd�D��Stdd�|D��}|oL|dkoL|dkS)Nzcciss/c3s|]}�j|�VqdS)N)r,)rC�n)r7r>r?rFvsz.StorageDevice.is_name_valid.<locals>.<genexpr>�/css|]}|dkVqdS)�r�N)r�r�r>)rC�cr>r>r?rFxsr�z..)r�r�r�rP)r7rZbadcharsr>)r7r?r,ns
zStorageDevice.is_name_valid)NNNNNrNFNrrr)F)F)F)F)N)N)N)N)F)T)T)N)F)X�__name__�
__module__�__qualname__�__doc__rur{Z_typermr�r�r�rOZconfig_actions_mapr/r@�propertyrErJrNrQrRrU�setterrXr]r^rarfrirkr[r5rhrvrxrzrr}rgr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r9r�r�r6rr_r�r�r�r4r�r�r�r0r�r�rjr�rKr�r�r�r:r<r;r�r,�
__classcell__r>r>)r=r?r-s�X

















.
r)rnr1rprrrrrZstorage_logrrZformatsr	r
r9rZloggingZ	getLoggerrrZrZnetworkr�librZdevicelibs.cryptorrr>r>r>r?�<module>s"