NineSec Team Shell
Server IP : 184.107.3.203  /  Your IP : 216.73.216.51
Web Server : Apache
System : Linux dedicated2.avenfashion.com.ph 4.18.0-553.40.1.el8_10.x86_64 #1 SMP Mon Feb 10 12:11:18 EST 2025 x86_64
User : adminteladeoro ( 1015)
PHP Version : 8.2.28
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /usr/lib64/python3.6/site-packages/sim_plugin/__pycache__/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : //usr/lib64/python3.6/site-packages/sim_plugin/__pycache__/simarray.cpython-36.pyc
3

�.'e|�@s�ddlZddlZddlZddlZddlZddlmZddlmZmZm	Z	m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZdd�Zdd�Zdd	�ZGd
d�de�ZGdd
�d
e�ZGdd�de�ZdS)�N)�size_human_2_size_bytes)�System�Volume�Disk�Pool�
FileSystem�AccessGroup�
FsSnapshot�	NfsExport�md5�LsmError�
TargetPort�ErrorNumber�	JobStatus�Battery�int_divcs�fdd�}|S)Ncs0y
�||�Stjk
r�}z^t|d�tkrJt|dd�rJ|djj�t|�dkrbtt	j
d��tt	jdt|���WYdd}~Xn�tk
r�t|d�tkr�t|dd�r�|djj��Ynftk
�r*}zHt|d�tko�t|dd��r|djj�tt	jdt|���WYdd}~XnXdS)Nr�bs_objzdatabase is lockedz%Timeout to require lock on state filez%Got unexpected error from sqlite3: %szGot unexpected error: %s)
�sqlite3�OperationalError�type�SimArray�hasattrr�trans_rollback�strrrZTIMEOUT�
PLUGIN_BUG�	Exception)�argsZkargs�	sql_errorZ
base_error)�method�� /usr/lib64/python3.6/simarray.py�wrapper s,
 z_handle_errors.<locals>.wrapperr)rr!r)rr �_handle_errorssr"cCs>dg}x,tdd�D]}|jtdtjdd���qWdj|�S)z.
    Generate a random VPD83 NAA_Type3 ID
    Z50r�z%02x��)�range�appendr�randomZrandint�join)Zvpd�_rrr �_random_vpd:sr+cCs0i}x&t|j�D]\}}||||d<qW|S)Nr)�	enumerate�description)�cursor�row�d�idx�colrrr �
_dict_factoryDsr3c@s8eZdZejdd�ejdd�ejdd�ejdd�ejdd�ej	dd�ej
dd�ejd	d�ejd
d�ej
dd�ejdd�ejd
d�ejdd�ejdd�iZejdd�ejdd�ejdd�ejdd�ejdd�ej	dd�ej
dd�ejdd�ejdd�ej
dd�ejdd�ejdd�ejdd�ejdd�iZedd��Zd S)!�PoolRAIDcCs|dkS)Nrr)�xrrr �<lambda>MszPoolRAID.<lambda>cCs|dkS)Nrr)r5rrr r6NscCs|dkS)N�r)r5rrr r6OscCs|dkS)N�r)r5rrr r6PscCs|dkS)Nr8r)r5rrr r6QscCs|dkS)Nr8r)r5rrr r6RscCs|dkS)N�r)r5rrr r6SscCs|dko|ddkS)Nr9r7rr)r5rrr r6TscCs|dko|ddkS)N�r7rr)r5rrr r6UscCs|dko|ddkS)N�r7rr)r5rrr r6VscCs|dko|ddkS)Nr:r7rr)r5rrr r6WscCs|dko|ddkS)Nr;r7rr)r5rrr r6XscCs|dko|ddkS)Nr:r7rr)r5rrr r6YscCs|dko|ddkS)Nr;r7rr)r5rrr r6ZscCs|S)Nr)r5rrr r6^scCs|S)Nr)r5rrr r6_scCsdS)N�r)r5rrr r6`scCs|dS)Nr<r)r5rrr r6ascCs|dS)Nr<r)r5rrr r6bscCs|dS)Nr<r)r5rrr r6cscCs|dS)Nr7r)r5rrr r6dscCs
t|d�S)Nr7)r)r5rrr r6escCst|d�dS)Nr7r<)r)r5rrr r6fscCst|d�dS)Nr7)r)r5rrr r6gscCs|dS)Nr7r)r5rrr r6hscCs|dS)Nr9r)r5rrr r6iscCst|d�dS)Nr7r<)r)r5rrr r6jscCst|d�dS)Nr7)r)r5rrr r6kscCsV|ttjj��kr"ttjd|��tj||�dkrHttjd||f��tj||�S)z�
        Return a integer indicating how many disks should be used as
        real data(not mirrored or parity) disks.
        Treating RAID 5 and 6 using fixed parity disk.
        z0data_disk_count(): Got unsupported raid type(%d)Fz;data_disk_count(): Illegal disk count(%d) for raid type(%d))�listr4�_RAID_DISK_CHK�keysrrr�_RAID_PARITY_DISK_COUNT_FUNC)�	raid_type�
disk_countrrr �data_disk_countnszPoolRAID.data_disk_countN)�__name__�
__module__�__qualname__r�RAID_TYPE_JBOD�RAID_TYPE_RAID0�RAID_TYPE_RAID1ZRAID_TYPE_RAID3ZRAID_TYPE_RAID4�RAID_TYPE_RAID5�RAID_TYPE_RAID6�RAID_TYPE_RAID10ZRAID_TYPE_RAID15ZRAID_TYPE_RAID16�RAID_TYPE_RAID50�RAID_TYPE_RAID60ZRAID_TYPE_RAID51ZRAID_TYPE_RAID61r>r@�staticmethodrCrrrr r4Ks:

























r4c	@s�eZdZdZdeZdZdZdZdZdZ	dZ
dZd�Ze
jZejZejZejZdZdZd
Zejejejejejejej gZ!d�d�d�d�d�d�d�d�gZ"dd�Z#dd�Z$dd�Z%dd�Z&dd�Z'dd�Z(dd �Z)d!d"�Z*d#d$�Z+d�d&d'�Z,d(d)�Z-d*d+�Z.d�d-d.�Z/d/d0�Z0d1d2�Z1d3d4�Z2d5d6�Z3d7d8�Z4d9d:�Z5d;d<�Z6d�d>d?�Z7d�d@dA�Z8dBdC�Z9d�dDdE�Z:d�dFdG�Z;dHdI�Z<dJdK�Z=dLdM�Z>e?dNdO��Z@d�dPdQ�ZAdRdS�ZBdTdU�ZCdVdW�ZDdXdY�ZEdZd[�ZFd\d]�ZGd^d_�ZHd�d`da�ZIdbdc�ZJddde�ZKe?dfdg��ZLd�dhdi�ZMdjdk�ZNdldm�ZOdndo�ZPdpdq�ZQdrds�ZRdtdu�ZSdvdw�ZTdxdy�ZUd�d{d|�ZVd}d~�ZWdd��ZXd�d��ZYd�d��ZZd�d�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�d��Zmd,S)��	BackStorez4.1zLSM_SIMULATOR_DATA_%sr<r7r8zsim-01zLSM simulated storage plug-ini�i�
�#�r;�� �@�cCstjj|�s2tjtj|tjtjB��tj|d�||_d|_	t
j|tt
|d��dd�|_t|j_d}|d7}|d7}|d7}|d	7}|d
7}|d7}|d7}|d
7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d7}|d 7}|d!7}|d"7}|jfd#tjtjtjtjtjd$��}|jj�}y|j|�Wnpt
jk
�r�}zd%t|�k�r�n|�WYdd}~Xn8t
jk
�r�}zttjd&|j��WYdd}~XnXdS)'Ni�i�Z	IMMEDIATE)�timeoutZisolation_levelzPRAGMA foreign_keys = ON;
z�
            CREATE TABLE systems (
            id TEXT PRIMARY KEY,
            name TEXT NOT NULL,
            status INTEGER NOT NULL,
            status_info TEXT,
            read_cache_pct INTEGER,
            version TEXT NOT NULL);
            a%
            CREATE TABLE tgts (
            id INTEGER PRIMARY KEY,
            port_type INTEGER NOT NULL,
            service_address TEXT NOT NULL,
            network_address TEXT NOT NULL,
            physical_address TEXT NOT NULL,
            physical_name TEXT NOT NULL);
            a�
            CREATE TABLE pools (
            id INTEGER PRIMARY KEY,
            name TEXT UNIQUE NOT NULL,
            status INTEGER NOT NULL,
            status_info TEXT,
            element_type INTEGER NOT NULL,
            unsupported_actions INTEGER,
            raid_type INTEGER NOT NULL,
            parent_pool_id INTEGER,
            member_type INTEGER,
            strip_size INTEGER,
            total_space LONG);
            a�
            CREATE TABLE disks (
            id INTEGER PRIMARY KEY,
            total_space LONG NOT NULL,
            disk_type INTEGER NOT NULL,
            status INTEGER NOT NULL,
            disk_prefix TEXT NOT NULL,
            location TEXT NOT NULL,
            owner_pool_id INTEGER,
            role TEXT,
            vpd83 TEXT,
            rpm INTEGER,
            link_type INTEGER,
            FOREIGN KEY(owner_pool_id)
            REFERENCES pools(id) ON DELETE SET DEFAULT);
            a;
            CREATE TABLE volumes (
            id INTEGER PRIMARY KEY,
            vpd83 TEXT NOT NULL,
            name TEXT UNIQUE NOT NULL,
            total_space LONG NOT NULL,
            consumed_size LONG NOT NULL,
            admin_state INTEGER,
            is_hw_raid_vol INTEGER,
            write_cache_policy INTEGER NOT NULL,
            read_cache_policy INTEGER NOT NULL,
            phy_disk_cache INTEGER NOT NULL,
            pool_id INTEGER NOT NULL,
            FOREIGN KEY(pool_id)
            REFERENCES pools(id) ON DELETE CASCADE);
            zx
            CREATE TABLE ags (
            id INTEGER PRIMARY KEY,
            name TEXT UNIQUE NOT NULL);
            z�
            CREATE TABLE inits (
            id TEXT UNIQUE NOT NULL,
            init_type INTEGER NOT NULL,
            owner_ag_id INTEGER NOT NULL,
            FOREIGN KEY(owner_ag_id)
            REFERENCES ags(id) ON DELETE CASCADE);
            a
            CREATE TABLE vol_masks (
            vol_id INTEGER NOT NULL,
            ag_id INTEGER NOT NULL,
            FOREIGN KEY(vol_id) REFERENCES volumes(id) ON DELETE CASCADE,
            FOREIGN KEY(ag_id) REFERENCES ags(id) ON DELETE CASCADE);
            aV
            CREATE TABLE vol_reps (
            rep_type INTEGER,
            src_vol_id INTEGER NOT NULL,
            dst_vol_id INTEGER NOT NULL,
            FOREIGN KEY(src_vol_id)
            REFERENCES volumes(id) ON DELETE CASCADE,
            FOREIGN KEY(dst_vol_id)
            REFERENCES volumes(id) ON DELETE CASCADE);
            a`
            CREATE TABLE fss (
            id INTEGER PRIMARY KEY,
            name TEXT UNIQUE NOT NULL,
            total_space LONG NOT NULL,
            consumed_size LONG NOT NULL,
            free_space LONG,
            pool_id INTEGER NOT NULL,
            FOREIGN KEY(pool_id)
            REFERENCES pools(id) ON DELETE CASCADE);
            a
            CREATE TABLE fs_snaps (
            id INTEGER PRIMARY KEY,
            name TEXT UNIQUE NOT NULL,
            fs_id INTEGER NOT NULL,
            timestamp LONG NOT NULL,
            FOREIGN KEY(fs_id)
            REFERENCES fss(id) ON DELETE CASCADE);
            a-
            CREATE TABLE fs_clones (
            src_fs_id INTEGER NOT NULL,
            dst_fs_id INTEGER NOT NULL,
            FOREIGN KEY(src_fs_id)
            REFERENCES fss(id) ON DELETE CASCADE,
            FOREIGN KEY(dst_fs_id)
            REFERENCES fss(id) ON DELETE CASCADE);
            ad
            CREATE TABLE exps (
            id INTEGER PRIMARY KEY,
            fs_id INTEGER NOT NULL,
            exp_path TEXT UNIQUE NOT NULL,
            auth_type TEXT,
            anon_uid INTEGER,
            anon_gid INTEGER,
            options TEXT,
            FOREIGN KEY(fs_id)
            REFERENCES fss(id) ON DELETE CASCADE);
            z�
            CREATE TABLE exp_root_hosts (
            host TEXT NOT NULL,
            exp_id INTEGER NOT NULL,
            FOREIGN KEY(exp_id)
            REFERENCES exps(id) ON DELETE CASCADE);
            z�
            CREATE TABLE exp_rw_hosts (
            host TEXT NOT NULL,
            exp_id INTEGER NOT NULL,
            FOREIGN KEY(exp_id)
            REFERENCES exps(id) ON DELETE CASCADE);
            z�
            CREATE TABLE exp_ro_hosts (
            host TEXT NOT NULL,
            exp_id INTEGER NOT NULL,
            FOREIGN KEY(exp_id)
            REFERENCES exps(id) ON DELETE CASCADE);
            z�
            CREATE TABLE jobs (
            id INTEGER PRIMARY KEY,
            duration REAL NOT NULL,
            timestamp TEXT NOT NULL,
            data_type INTEGER,
            data_id INTEGER);
            z�
            CREATE TABLE batteries (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            type INTEGER NOT NULL,
            status INTEGER NOT NULL);
            a�
            CREATE VIEW pools_view AS
                SELECT
                    pool0.id,
                        'POOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || pool0.id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_pool_id,
                    pool0.name,
                    pool0.status,
                    pool0.status_info,
                    pool0.element_type,
                    pool0.unsupported_actions,
                    pool0.raid_type,
                    pool0.member_type,
                    pool0.parent_pool_id,
                        'POOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || pool0.parent_pool_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    parent_lsm_pool_id,
                    pool0.strip_size,
                    pool1.total_space total_space,
                    pool1.total_space -
                    pool2.vol_consumed_size  -
                    pool3.fs_consumed_size -
                    pool4.sub_pool_consumed_size free_space,
                    pool1.data_disk_count,
                    pool5.disk_count
                FROM
                    pools pool0
                        LEFT JOIN (
                            SELECT
                                pool.id,
                                    ifnull(pool.total_space,
                                        ifnull(SUM(disk.total_space), 0))
                                total_space,
                                COUNT(disk.id) data_disk_count
                            FROM pools pool
                                LEFT JOIN disks disk
                                    ON pool.id = disk.owner_pool_id AND
                                       disk.role = 'DATA'
                            GROUP BY
                                pool.id
                        ) pool1 ON pool0.id = pool1.id

                        LEFT JOIN (
                            SELECT
                                pool.id,
                                ifnull(SUM(volume.consumed_size), 0)
                                vol_consumed_size
                            FROM pools pool
                                LEFT JOIN volumes volume
                                    ON volume.pool_id = pool.id
                            GROUP BY
                                pool.id
                        ) pool2 ON pool0.id = pool2.id

                        LEFT JOIN (
                            SELECT
                                pool.id,
                                ifnull(SUM(fs.consumed_size), 0)
                                fs_consumed_size
                            FROM pools pool
                                LEFT JOIN fss fs
                                    ON fs.pool_id = pool.id
                            GROUP BY
                                pool.id
                        ) pool3 ON pool0.id = pool3.id

                        LEFT JOIN (
                            SELECT
                                pool.id,
                                ifnull(SUM(sub_pool.total_space), 0)
                                sub_pool_consumed_size
                            FROM pools pool
                                LEFT JOIN pools sub_pool
                                    ON sub_pool.parent_pool_id = pool.id
                            GROUP BY
                                pool.id
                        ) pool4 ON pool0.id = pool4.id
                        LEFT JOIN (
                            SELECT
                                pool.id,
                                COUNT(disk.id) disk_count
                            FROM pools pool
                                LEFT JOIN disks disk
                                    ON pool.id = disk.owner_pool_id
                            GROUP BY
                                pool.id
                        ) pool5 ON pool0.id = pool5.id
                GROUP BY
                    pool0.id;
            a
            CREATE VIEW tgts_view AS
                SELECT
                    id,
                        'TGT_PORT_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_tgt_id,
                    port_type,
                    service_address,
                    network_address,
                    physical_address,
                    physical_name
                FROM
                    tgts;
            a�
            CREATE VIEW disks_view AS
                SELECT
                    id,
                        'DISK_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_disk_id,
                        disk_prefix || '_' || id
                    name,
                    total_space,
                    disk_type,
                    role,
                    status,
                    vpd83,
                    rpm,
                    link_type,
                    location,
                    owner_pool_id
                FROM
                    disks;
            af
            CREATE VIEW volumes_view AS
                SELECT
                    id,
                        'VOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_vol_id,
                    vpd83,
                    name,
                    total_space,
                    consumed_size,
                    admin_state,
                    is_hw_raid_vol,
                    write_cache_policy,
                    read_cache_policy,
                    phy_disk_cache,
                    pool_id,
                        'POOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || pool_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_pool_id
                FROM
                    volumes;
            a�
            CREATE VIEW fss_view AS
                SELECT
                    id,
                        'FS_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_fs_id,
                    name,
                    total_space,
                    consumed_size,
                    free_space,
                    pool_id,
                        'POOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || pool_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_pool_id
                FROM
                    fss;
            a�
            CREATE VIEW bats_view AS
                SELECT
                    id,
                        'BAT_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_bat_id,
                    name,
                    type,
                    status
                FROM
                    batteries;
            ap
            CREATE VIEW fs_snaps_view AS
                SELECT
                    id,
                        'FS_SNAP_ID_' ||
                            SUBSTR('{ID_PADDING}' || id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_fs_snap_id,
                    name,
                    timestamp,
                    fs_id,
                        'FS_ID_' ||
                            SUBSTR('{ID_PADDING}' || fs_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_fs_id
                FROM
                    fs_snaps;
            a;
            CREATE VIEW volumes_by_ag_view AS
                SELECT
                    vol.id,
                        'VOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || vol.id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_vol_id,
                    vol.vpd83,
                    vol.name,
                    vol.total_space,
                    vol.consumed_size,
                    vol.pool_id,
                        'POOL_ID_' ||
                            SUBSTR('{ID_PADDING}' || vol.pool_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_pool_id,
                    vol.admin_state,
                    vol.is_hw_raid_vol,
                    vol_mask.ag_id ag_id,
                    vol.write_cache_policy,
                    vol.read_cache_policy,
                    vol.phy_disk_cache
                FROM
                    volumes vol
                        LEFT JOIN vol_masks vol_mask
                            ON vol_mask.vol_id = vol.id;
            a
            CREATE VIEW ags_view AS
                SELECT
                    ag.id,
                        'AG_ID_' ||
                            SUBSTR('{ID_PADDING}' || ag.id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_ag_id,
                    ag.name,
                        CASE
                            WHEN count(DISTINCT init.init_type) = 1
                                THEN init.init_type
                            WHEN count(DISTINCT init.init_type) = 2
                                THEN {AG_INIT_TYPE_MIXED}
                            ELSE {AG_INIT_TYPE_UNKNOWN}
                        END
                    init_type,
                    group_concat(init.id, '{SPLITTER}') init_ids_str
                FROM
                    ags ag
                        LEFT JOIN inits init
                            ON ag.id = init.owner_ag_id
                GROUP BY
                    ag.id
                ORDER BY
                    init.init_type;
            aO
            CREATE VIEW ags_by_vol_view AS
                SELECT
                    ag_new.id,
                        'AG_ID_' ||
                            SUBSTR('{ID_PADDING}' || ag_new.id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_ag_id,
                    ag_new.name,
                    ag_new.init_type,
                    ag_new.init_ids_str,
                    vol_mask.vol_id vol_id
                FROM
                    (
                        SELECT
                            ag.id,
                            ag.name,
                                CASE
                                    WHEN count(DISTINCT init.init_type) = 1
                                        THEN init.init_type
                                    WHEN count(DISTINCT init.init_type) = 2
                                        THEN {AG_INIT_TYPE_MIXED}
                                    ELSE {AG_INIT_TYPE_UNKNOWN}
                                END
                            init_type,
                            group_concat(init.id, '{SPLITTER}') init_ids_str
                        FROM
                            ags ag
                                LEFT JOIN inits init
                                    ON ag.id = init.owner_ag_id
                        GROUP BY
                            ag.id
                        ORDER BY
                            init.init_type
                    ) ag_new
                        LEFT JOIN vol_masks vol_mask
                            ON vol_mask.ag_id = ag_new.id
            ;
            ag
            CREATE VIEW exps_view AS
                SELECT
                    exp.id,
                        'EXP_ID_' ||
                            SUBSTR('{ID_PADDING}' || exp.id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_exp_id,
                    exp.fs_id,
                        'FS_ID_' ||
                            SUBSTR('{ID_PADDING}' || exp.fs_id,
                                   -{ID_FMT_LEN}, {ID_FMT_LEN})
                    lsm_fs_id,
                    exp.exp_path,
                    exp.auth_type,
                    exp.anon_uid,
                    exp.anon_gid,
                    exp.options,
                    exp2.exp_root_hosts_str,
                    exp3.exp_rw_hosts_str,
                    exp4.exp_ro_hosts_str
                FROM
                    exps exp
                        LEFT JOIN (
                            SELECT
                                exp_t2.id,
                                    group_concat(
                                        exp_root_host.host, '{SPLITTER}')
                                exp_root_hosts_str
                            FROM
                                exps exp_t2
                                LEFT JOIN exp_root_hosts exp_root_host
                                    ON exp_t2.id = exp_root_host.exp_id
                            GROUP BY
                                exp_t2.id
                        ) exp2
                            ON exp.id = exp2.id
                        LEFT JOIN (
                            SELECT
                                exp_t3.id,
                                    group_concat(
                                        exp_rw_host.host, '{SPLITTER}')
                                exp_rw_hosts_str
                            FROM
                                exps exp_t3
                                LEFT JOIN exp_rw_hosts exp_rw_host
                                    ON exp_t3.id = exp_rw_host.exp_id
                            GROUP BY
                                exp_t3.id
                        ) exp3
                            ON exp.id = exp3.id
                        LEFT JOIN (
                            SELECT
                                exp_t4.id,
                                    group_concat(
                                        exp_ro_host.host, '{SPLITTER}')
                                exp_ro_hosts_str
                            FROM
                                exps exp_t4
                                LEFT JOIN exp_ro_hosts exp_ro_host
                                    ON exp_t4.id = exp_ro_host.exp_id
                            GROUP BY
                                exp_t4.id
                        ) exp4
                            ON exp.id = exp4.id
                GROUP BY
                    exp.id;
            ;
            �0)Z
ID_PADDINGZ
ID_FMT_LENZAG_INIT_TYPE_MIXEDZAG_INIT_TYPE_UNKNOWNZSPLITTERzalready existszLStored simulator state incompatible with simulator, please move or delete %s) �os�path�exists�close�open�O_WRONLY�O_CREAT�chmod�	statefile�	lastrowidrZconnect�intr�sql_connr3Zrow_factory�formatrP�_ID_FMT_LENrZINIT_TYPE_ISCSI_WWPN_MIXEDZINIT_TYPE_UNKNOWN�_LIST_SPLITTERr.Z
executescriptrrZ
DatabaseErrorrr�INVALID_ARGUMENT)�selfrcrY�sql_cmd�sql_currrrr �__init__�s�		
		]'E
zBackStore.__init__cCs^|j�}t|�dks|dr"dSd|dj�krH|ddtjkrHdSttjd|j��dS)NrF�versionTzLStored simulator state incompatible with simulator, please move or delete %s)	�sim_syss�lenr?rP�VERSION_SIGNATURErrrjrc)rkrprrr �_check_version-szBackStore._check_versionc	Cs|j�|j�r|j�dS|jdtjtjtjdtj	tj
d��td�}td�}td�}g}xHtdd	�D]:}|jd
d|t
jt
jt�dt
jd
|d��|j|j�qhWg}xTtdd�D]F}|jd
d|t
jt
jt�dt
jd|d��t|�d	kr�|j|j�q�Wg}xZtdd�D]L}|jd
d|t
jt
jt�t
jt
jd|d��t|�d	k�r|j|j��qWx@tdd�D]2}|jd
d|t
jt
jt�t
jt
jd|d���qlW|jdtj|tjtjBtjBtjBtj Btj!tj"Bd�}|j#d|tjtjBtjB|d�|jdtj|tjtjBtjBd�|jdtjtjBtjBtj$|d �|jd!t%j&d"d"d"d#d$��|jd!t%j'd%d%d%d&d$��|jd!t%j(d'd(d)d*d$��|jd!t%j(d'd+d,d-d$��|jd!t%j(d'd.d,d-d$��|jd/d0t)j*t)jd1��|jd/d2t)j+t)jd1��|j�dSdS)3z^
        Raise error if version not match.
        If empty database found, initiate.
        N�systemsr%)�id�name�status�status_inforo�read_cache_pctZ1EiBZ2TiBZ512GiBrr7�disksz2TiB SATA Diski zPort: %d Box: 1 Bay: 1)Zdisk_prefix�total_space�	disk_typerw�vpd83�rpm�	link_type�locationr:z
2EiB SAS Diski�:zPort: %d Box: 1 Bay: 2rTz512GiB SSD DiskzPort: %d Box: 1 Bay: 3r#z
2TiB SSD DiskzPort: %d Box: 1 Bay: 4zPool 1)rvrA�sim_disk_ids�element_type�unsupported_actionszPool 2(sub pool of Pool 1))rv�parent_pool_idr��sizezPool 3)rvrAr�r�Z
lsm_test_aggr)rvr�rAr�Ztgtsz50:0a:09:86:99:4b:8d:c5ZFC_a_0b)�	port_type�service_address�network_address�physical_address�
physical_namez50:0a:09:86:99:4b:8d:c6Z	FCoE_b_0cz"iqn.1986-05.com.example:sim-tgt-03z sim-iscsi-tgt-3.example.com:3260za4:4e:31:47:f4:e0Z
iSCSI_c_0dz
10.0.0.1:3260za4:4e:31:47:f4:e1Z
iSCSI_c_0ez%[2001:470:1f09:efe:a64e:31ff::1]:3260�	batteriesz'Battery SIMB01, 8000 mAh, 05 March 2016)rvrrwz&Capacitor SIMC01, 500 J, 05 March 2016),�trans_beginrs�trans_commit�	_data_addrP�SYS_ID�SYS_NAMEr�	STATUS_OKrr�_DEFAULT_READ_CACHE_PCTrr&rZ	TYPE_SATAr+Z
LINK_TYPE_ATAr'rdZTYPE_SASZ
LINK_TYPE_SASrqZTYPE_SSDZRPM_NON_ROTATING_MEDIUM�sim_pool_create_from_diskrrIrZELEMENT_TYPE_POOLZELEMENT_TYPE_FS�ELEMENT_TYPE_VOLUMEZELEMENT_TYPE_DELTAZELEMENT_TYPE_SYS_RESERVED�UNSUPPORTED_VOLUME_GROW�UNSUPPORTED_VOLUME_SHRINK�sim_pool_create_sub_poolrHr
ZTYPE_FCZ	TYPE_FCOEZ
TYPE_ISCSIrZ
TYPE_CHEMICALZTYPE_CAPACITOR)	rkZ
size_bytes_1eZ
size_bytes_2tZsize_bytes_512gZpool_1_disks�iZtest_pool_disksZssd_pool_disksZ	pool_1_idrrr �check_version_and_init;s







z BackStore.check_version_and_initcCs$|jj�}|j|�|j|_|j�S)z9
        Execute sql command and get all output.
        )rfr.�executerdZfetchall)rkrlrmrrr �	_sql_exec�s

zBackStore._sql_execcCsd|}|j|�S)NzSELECT * FROM %s)r�)rk�
table_namerlrrr �
_get_tableszBackStore._get_tablecCs|jjd�dS)NzBEGIN IMMEDIATE TRANSACTION;)rfr�)rkrrr r�szBackStore.trans_begincCs|jj�dS)N)rfZcommit)rkrrr r�szBackStore.trans_commitcCs|jj�dS)N)rfZrollback)rkrrr rszBackStore.trans_rollbackcCsRt|j��}dd�t|j��D�}d|ddj|�ddj|�f}|j|�dS)NcSs g|]}|dkrdnt|��qS)Nr%)r)�.0�vrrr �
<listcomp>sz'BackStore._data_add.<locals>.<listcomp>z INSERT INTO %s (%s) VALUES (%s);z'%s'z', ')r=r?�valuesr)r�)rkr�Z	data_dictr?r�rlrrr r�szBackStore._data_addFcCsZd||f}|j|�}|rRt|�dkr*dSt|�dkr>|dSttjdt���n|SdS)NzSELECT * FROM %s WHERE %srr<z%_data_find(): Got non-unique data: %s)r�rqrrr�locals)rk�table�	condition�flag_uniquerlZ	sim_datasrrr �
_data_finds
zBackStore._data_findcCs6|dkrd|||f}nd||||f}|j|�dS)Nz#UPDATE %s SET %s=NULL WHERE id='%s'z#UPDATE %s SET %s='%s' WHERE id='%s')r�)rkr��data_idZcolumn_name�valuerlrrr �_data_update.szBackStore._data_updatecCsd||f}|j|�dS)NzDELETE FROM %s WHERE %s;)r�)rkr�r�rlrrr �_data_delete8szBackStore._data_deleteNcCs*|jdtjdtj�tj�||d��|jS)z*
        Return a job id(Integer)
        �jobsZLSM_SIM_TIME)�duration�	timestamp�	data_typer�)r�r[�getenvrP�JOB_DEFAULT_DURATION�timerd)rkZ
job_data_typer�rrr �sim_job_create<s
zBackStore.sim_job_createcCs|jdd|�dS)Nr�zid="%s")r�)rk�
sim_job_idrrr �sim_job_deleteKszBackStore.sim_job_deletecCs�|jdd|dd�}|dkr(ttjd��|ddkrZttj�t|d	�|dd
�}nd
}d}d}|dkrrd}|d
kr�d
}|dtjkr�|j	|d�}|d}nJ|dtj
kr�|j|d�}|d}n$|dtjkr�|j
|d�}|d}|||fS)
zg
        Return (progress, data_type, data) tuple.
        progress is the integer of percent.
        r�zid=%sT)r�Nz
Job not foundr�rr��dr�r�)r�rr�
NOT_FOUND_JOBrer��floatrP�JOB_DATA_TYPE_VOL�
sim_vol_of_id�JOB_DATA_TYPE_FS�sim_fs_of_id�JOB_DATA_TYPE_FS_SNAP�sim_fs_snap_of_id)rkr�Zsim_job�progress�datar�rrr �sim_job_statusNs2
$

zBackStore.sim_job_statuscCs
|jd�S)z0
        Return a list of sim_sys dict.
        rt)r�)rkrrr rptszBackStore.sim_sysscCstdd�|jdd|�D��S)Ncss|]}|dVqdS)�lsm_disk_idNr)r�r0rrr �	<genexpr>|sz1BackStore.lsm_disk_ids_of_pool.<locals>.<genexpr>�
disks_viewzowner_pool_id="%s")r=r�)rk�sim_pool_idrrr �lsm_disk_ids_of_poolzszBackStore.lsm_disk_ids_of_poolcCs
|jd�S)z1
        Return a list of sim_disk dict.
        r�)r�)rkrrr �	sim_disks�szBackStore.sim_diskscCs
|jd�S)z1
        Return a list of sim_pool dict.
        �
pools_view)r�)rkrrr �	sim_pools�szBackStore.sim_poolscCs|jd|tjd�S)Nr�r)�_sim_data_of_idr�NOT_FOUND_POOL)rkr�rrr �sim_pool_of_id�szBackStore.sim_pool_of_idrc
Cs�|dkrtj}|tjks"|tjkr(tj}|jd|tjd|||tj	|d��t
j|t|��}|j
}x4|d|�D]$}	|jd|	d|�|jd|	dd�qnWx4||d�D]$}	|jd|	d|�|jd|	dd	�q�W|S)
Nr�poolsr%)rvrwrxr�r�rA�member_type�
strip_sizerzZ
owner_pool_id�roleZDATAZPARITY)rP�DEFAULT_STRIP_SIZErrIrG�BLK_SIZEr�rr��MEMBER_TYPE_DISKr4rCrqrdr�)
rkrvr�rAr�r�r�rCr�Zsim_disk_idrrr r��s:


z#BackStore.sim_pool_create_from_diskcCs,|jd|tjd||tjtj||d�	�|jS)Nr�r%)	rvrwrxr�r�rAr�r�r{)r�rr�r�RAID_TYPE_OTHER�MEMBER_TYPE_POOLrd)rkrvr�r�r�r�rrr r��s
z"BackStore.sim_pool_create_sub_poolcCs|jd|�ddS)Nz3SELECT COUNT(id) FROM disks WHERE owner_pool_id=%s;r)r�)rkr�rrr �sim_pool_disks_count�szBackStore.sim_pool_disks_countcCs|jd|�ddS)NzCSELECT COUNT(id) FROM disks WHERE owner_pool_id=%s and role='DATA';r)r�)rkr�rrr �sim_pool_data_disks_count�sz#BackStore.sim_pool_data_disks_countcCs"|r|jdd|�S|jd�SdS)z0
        Return a list of sim_vol dict.
        Zvolumes_by_ag_viewzag_id=%s�volumes_viewN)r�r�)rk�	sim_ag_idrrr �sim_vols�szBackStore.sim_volscCs8|j|d|dd�}|dkr4|r0t|d|��ndS|S)Nzid=%sT)r�z%s not found)r�r)rkr�r��lsm_error_noZ	data_name�sim_datarrr r��szBackStore._sim_data_of_idcCs|jd|tjd�S)zD
        Return sim_vol if found. Raise error if not found.
        r�r)r�r�NOT_FOUND_VOLUME)rk�
sim_vol_idrrr r��szBackStore.sim_vol_of_idcCs&|j|�}|d|kr"ttjd��dS)N�
free_spacezInsufficient space in pool)r�rr�NOT_ENOUGH_SPACE)rkr��
size_bytes�sim_poolrrr �_check_pool_free_space�s
z BackStore._check_pool_free_spacecCs|tjdtjtjS)Nr<)rPr�)r�rrr �_block_rounding�szBackStore._block_roundingcCs�tj|�}|j||�t�}t�|d<||d<||d<||d<||d<tj|d<||d<tj|d<tj|d	<tj	|d
<y|j
d|�Wn4tjk
r�}zt
tjd|��WYdd}~XnX|jS)
Nr}rv�pool_idr{�
consumed_size�admin_state�is_hw_raid_vol�write_cache_policy�read_cache_policy�phy_disk_cache�volumesz+Name '%s' is already in use by other volume)rPr�r��dictr+r�ADMIN_STATE_ENABLED�DEFAULT_WRITE_CACHE_POLICY�DEFAULT_READ_CACHE_POLICY�DEFAULT_PHYSICAL_DISK_CACHEr�r�IntegrityErrorrr�
NAME_CONFLICTrd)rkrvr�r�r��sim_volrrrr �sim_vol_create�s(





zBackStore.sim_vol_createcCs�|j|�}|j|�r ttjd��|j|�}t|�dkrXx |D]}||kr<ttjd��q<W|dr�x0|jdd|d�D]}|j	d|d	d
d�qvW|j
dd
|d�n|j
dd
|�dS)zB
        This does not check whether volume exist or not.
        z Volume is masked to access groupr<z%Requested volume has child dependencyr�r�zowner_pool_id="%s"r�rzrur�Nr�zid="%s"r�)r��_sim_ag_ids_of_masked_volrr�	IS_MASKED�dst_sim_vol_ids_of_srcrq�HAS_CHILD_DEPENDENCYr�r�r�)rkr�r��dst_sim_vol_ids�dst_sim_vol_idr0rrr �sim_vol_deletes$




zBackStore.sim_vol_deletecCsN|j|�|j|�|jdd||f�}|r8ttjd��|jd||d��dS)N�	vol_maskszag_id="%s" AND vol_id="%s"z2Volume is already masked to requested access group)�ag_id�vol_id)r��sim_ag_of_idr�rr�NO_STATE_CHANGEr�)rkr�r��
exist_maskrrr �sim_vol_mask6s

zBackStore.sim_vol_maskcCsN|j|�|j|�d||f}|jd|�}|r>|jd|�nttjd��dS)Nzag_id="%s" AND vol_id="%s"r�z.Volume is not masked to requested access group)r�r�r�r�rrr)rkr�r�r�rrrr �sim_vol_unmaskFs

zBackStore.sim_vol_unmaskcCstdd�|jdd|�D��S)Ncss|]}|dVqdS)r�Nr)r��mrrr r�Usz6BackStore._sim_vol_ids_of_masked_ag.<locals>.<genexpr>r�z
ag_id="%s")r=r�)rkr�rrr �_sim_vol_ids_of_masked_agSs
z#BackStore._sim_vol_ids_of_masked_agcCstdd�|jdd|�D��S)Ncss|]}|dVqdS)r�Nr)r�rrrr r�Zsz6BackStore._sim_ag_ids_of_masked_vol.<locals>.<genexpr>r�zvol_id="%s")r=r�)rkr�rrr r�Xs
z#BackStore._sim_ag_ids_of_masked_volcCs�tj|�}|j|�}|d|kr,ttjd��|j|d�}||d}|dkr�|dtj@rhttj	d��|d|kr�ttj
d��n|dtj@r�ttj	d��|jd	|d|�|jd	|d
|�dS)Nr{z%Volume size is identical to requestedr�rr�z.Requested pool does not allow volume size growr�zInsufficient space in poolr�r�)
rPr�r�rrrr�rr��
NO_SUPPORTr�r�r�)rkr��new_size_bytesr�r�Z	incrementrrr �sim_vol_resize]s0

zBackStore.sim_vol_resizecCs(|j|�tdd�|jdd|�D��S)zL
        Return a list of dst_vol_id for provided source volume ID.
        css|]}|dVqdS)�
dst_vol_idNr)r�r0rrr r��sz3BackStore.dst_sim_vol_ids_of_src.<locals>.<genexpr>�vol_repszsrc_vol_id="%s")r�r=r�)rk�src_sim_vol_idrrr r��s

z BackStore.dst_sim_vol_ids_of_srccCst|j|�|j|�||kr dS|tjkr.dStdd�|jdd|�D��}t|�dkr\dS|jd|||d��dS)Ncss|]}|dVqdS)�
src_vol_idNr)r��rrrr r��sz,BackStore.sim_vol_replica.<locals>.<genexpr>r
zdst_vol_id="%s"r<)rr	�rep_type)r�rZREPLICATE_COPYr=r�rqr�)rkrr�rZ
blk_rangesZcur_src_sim_vol_idsrrr �sim_vol_replica�s 



zBackStore.sim_vol_replicacCs*|j|�sttjd��|jdd|�dS)Nz+Provided volume is not a replication sourcer
zsrc_vol_id="%s")r�rrrr�)rkrrrr �sim_vol_src_replica_break�s
z#BackStore.sim_vol_src_replica_breakcCs6|j|�}|d|kr"ttjd��|jd|d|�dS)Nr�z,Volume admin state is identical to requestedr�)r�rrrr�)rkr�Znew_admin_stater�rrr �sim_vol_state_change�s
zBackStore.sim_vol_state_changecCs|djtj�|d<|d=|S)z=
        Update 'init_type' and 'init_ids' of sim_ag
        Zinit_ids_str�init_ids)�splitrPri)�sim_agrrr �_sim_ag_format�szBackStore._sim_ag_formatcCs.|r|jdd|�}n
|jd�}dd�|D�S)NZags_by_vol_viewz	vol_id=%s�ags_viewcSsg|]}tj|��qSr)rPr)r��arrr r��sz%BackStore.sim_ags.<locals>.<listcomp>)r�r�)rkr��sim_agsrrr r�s

zBackStore.sim_agscCsRy|jd|||d��Wn4tjk
rL}zttjd|��WYdd}~XnXdS)N�inits)ru�	init_typeZowner_ag_idz6Initiator '%s' is already in use by other access group)r�rr�rrZEXISTS_INITIATOR)rkr�init_idr�rrrr �_sim_init_create�szBackStore._sim_init_createcCsdS)Nr)rkr�in_user�in_pass�out_user�out_passrrr �iscsi_chap_auth_set�szBackStore.iscsi_chap_auth_setcCsby|jdd|i�|j}Wn4tjk
rN}zttjd|��WYdd}~XnX|j|||�|S)N�agsrvz1Name '%s' is already in use by other access group)r�rdrr�rrr�r)rkrvrrr�rrrr �
sim_ag_create�s
zBackStore.sim_ag_createcCs4|j|�|j|�r ttjd��|jdd|�dS)Nz!Access group has volume masked tor"zid="%s")r�rrrr�r�)rkr�rrr �
sim_ag_delete�s

zBackStore.sim_ag_deletecCsT|j|�}||dkr"ttjd��|tjkrB|tjkrBttjd��|j|||�dS)Nrz!Initiator already in access groupz.Only support iSCSI IQN and WWPN initiator type)	r�rrrrZINIT_TYPE_ISCSI_IQNZINIT_TYPE_WWPNrr)rkr�rrrrrr �sim_ag_init_add�s


zBackStore.sim_ag_init_addcCsR|j|�}||dkr"ttjd��t|d�dkr>ttjd��|jdd|�dS)Nrz(Initiator is not in defined access groupr<z6Refused to remove the last initiator from access grouprzid="%s")r�rrrrqZLAST_INIT_IN_ACCESS_GROUPr�)rkr�rrrrr �sim_ag_init_deletes
zBackStore.sim_ag_init_deletecCs |jd|tjd�}tj|�|S)NrzAccess Group)r�rZNOT_FOUND_ACCESS_GROUPrPr)rkr�rrrr r�s

zBackStore.sim_ag_of_idcCs
|jd�S)z/
        Return a list of sim_fs dict.
        �fss_view)r�)rkrrr �sim_fss szBackStore.sim_fssTcCstj}|sd}|jd||d�S)Nr'zFile System)r�NOT_FOUND_FSr�)rk�	sim_fs_idZraise_errorr�rrr r�&s
zBackStore.sim_fs_of_idcCsntj|�}|j||�y|jd|||||d��Wn4tjk
rf}zttjd|��WYdd}~XnX|j	S)N�fss)rvr{r�r�r�z'Name '%s' is already in use by other fs)
rPr�r�r�rr�rrr�rd)rkrvr�r�rrrr �
sim_fs_create.s
zBackStore.sim_fs_createcCs4|j|�|j|�r ttjd��|jdd|�dS)Nz*Requested file system has child dependencyr+zid="%s")r��clone_dst_sim_fs_ids_of_srcrrr�r�)rkr*rrr �
sim_fs_deleteAs

zBackStore.sim_fs_deletecCs�tj|�}|j|�}|d|kr,ttjd��|j|d�}||dkrf|d||dkrfttjd��|jd|d|�|jd|d|�|jd|d|�dS)Nr{z*File System size is identical to requestedr�r�zInsufficient space in poolr+r�)	rPr�r�rrrr�r�r�)rkr*r�sim_fsr�rrr �
sim_fs_resizeJs"


zBackStore.sim_fs_resizecCs|j|�|jdd|�S)N�
fs_snaps_viewz
fs_id="%s")r�r�)rkr*rrr �sim_fs_snapsds
zBackStore.sim_fs_snapscCs2|jd|tjd�}|r.|d|kr.ttjd��|S)Nr1zFile system snapshot�fs_idzFDefined file system snapshot ID is not belong to requested file system)r�r�NOT_FOUND_FS_SSr)rk�sim_fs_snap_idr*�sim_fs_snaprrr r�hszBackStore.sim_fs_snap_of_idcCsb|j|�y |jd||ttj��d��Wn0tjk
rZ}zttjd��WYdd}~XnX|j	S)N�fs_snaps)rvr3r�z6The name is already used by other file system snapshot)
r�r�rer�rr�rrr�rd)rkr*rvrrrr �sim_fs_snap_createss
zBackStore.sim_fs_snap_createcCs|j|�|r|j||�dS)N)r�r�)rkr*r5�files�
restore_files�flag_all_filesrrr �sim_fs_snap_restore�s
zBackStore.sim_fs_snap_restorecCs*|j|�|j||�|jdd|�dS)Nr7zid="%s")r�r�r�)rkr5r*rrr �sim_fs_snap_delete�s
zBackStore.sim_fs_snap_deletecCsd|}|j|�dS)Nz&DELETE FROM fs_snaps WHERE fs_id='%s';)r�)rkr*rlrrr �sim_fs_snap_del_by_fs�szBackStore.sim_fs_snap_del_by_fscCs:|j|�|j|�|r$|j||�|jd||d��dS)N�	fs_clones)�	src_fs_id�	dst_fs_id)r�r�r�)rk�
src_sim_fs_id�
dst_sim_fs_idr5rrr �sim_fs_clone�s

zBackStore.sim_fs_clonecCs|j|�|r|j||�dS)N)r�r�)rkr*�src_fs_name�dst_fs_namer5rrr �sim_fs_file_clone�s
zBackStore.sim_fs_file_clonecCs(|j|�tdd�|jdd|�D��S)zM
        Return a list of dst_fs_id for provided clone source fs ID.
        css|]}|dVqdS)rANr)r�r0rrr r��sz8BackStore.clone_dst_sim_fs_ids_of_src.<locals>.<genexpr>r?zsrc_fs_id="%s")r�r=r�)rkrBrrr r-�s

z%BackStore.clone_dst_sim_fs_ids_of_srccCs|jdd|�dS)Nr?zsrc_fs_id="%s")r�)rkrBrrr �sim_fs_src_clone_break�sz BackStore.sim_fs_src_clone_breakcCsFx@dD]8}d|}||r0||jtj�||<ng||<||=qW|S)N�
root_hosts�rw_hosts�ro_hostsz
exp_%s_str)rIrJrK)rrPri)rk�sim_expZkey_namer�rrr �_sim_exp_format�s

zBackStore._sim_exp_formatcst�fdd��jd�D��S)Nc3s|]}�j|�VqdS)N)rM)r��e)rkrr r��sz%BackStore.sim_exps.<locals>.<genexpr>�	exps_view)r=r�)rkr)rkr �sim_exps�szBackStore.sim_expscCs|j|jd|tjd��S)NrOz
NFS Export)rMr�r�NOT_FOUND_NFS_EXPORT)rk�
sim_exp_idrrr �
sim_exp_of_id�szBackStore.sim_exp_of_idc
Cs�|dkrdt�dd�}|j|�y|jd||||||	d��Wn0tjk
rr}
zttjd��WYdd}
~
XnX|j}x|D]}|jd||d��q�Wx|D]}
|jd|
|d��q�Wx|D]}|jd	||d��q�W|S)
Nz/nfs_exp_%sr;�exps)r3�exp_path�anon_uid�anon_gid�	auth_type�optionsz/Export path is already used by other NFS exportZexp_root_hosts)�host�exp_idZexp_rw_hostsZexp_ro_hosts)	r+r�r�rr�rrr�rd)rkr*rUrIrJrKrVrWrXrYrrRZ	root_hostZrw_hostZro_hostrrr �sim_exp_create�sB



zBackStore.sim_exp_createcCs|j|�|jdd|�dS)NrTzid="%s")rSr�)rkrRrrr �sim_exp_deletes
zBackStore.sim_exp_deletecCs
|jd�S)z0
        Return a list of sim_tgt dict.
        Z	tgts_view)r�)rkrrr �sim_tgtsszBackStore.sim_tgtscCs
|jd�S)z0
        Return a list of sim_bat dict.
        Z	bats_view)r�)rkrrr �sim_batsszBackStore.sim_batscCs|j|�|jd|d|�dS)Nr�r�)r�r�)rkr��pdcrrr �sim_vol_pdc_sets
zBackStore.sim_vol_pdc_setcCs|j|�|jd|d|�dS)Nr�r�)r�r�)rkr��rcprrr �sim_vol_rcp_sets
zBackStore.sim_vol_rcp_setcCs|j|�|jd|d|�dS)Nr�r�)r�r�)rkr��wcprrr �sim_vol_wcp_sets
zBackStore.sim_vol_wcp_setii i@i�iiiii)F)NN)rr)r)N)N)r)N)N)T)N)nrDrErF�VERSIONrrr�r�r�r�r�r�r�r�rZMODE_HARDWARE_RAID�SYS_MODEr�WRITE_CACHE_POLICY_AUTOr��READ_CACHE_POLICY_ENABLEDr�ZPHYSICAL_DISK_CACHE_DISABLEDr�r�rirhrHrIrJrKrLrMrN�SUPPORTED_VCR_RAID_TYPES�SUPPORTED_VCR_STRIP_SIZESrnrsr�r�r�r�r�rr�r�r�r�r�r�r�rpr�r�r�r�r�r�r�r�r�r�r�r�rOr�r�r�rrrr�rr�rrrrrrr!r#r$r%r&r�r(r�r,r.r0r2r�r8r<r=r>rDrGr-rHrMrPrSr\r]r^r_rarcrerrrr rP�s�E	



&
)





#

 



		

	
			2rPc@seZdZejdej�d�Zedd��Z	edd��Z
edd��Zed	d
��Zedd��Z
ed
d��Zedd��Zedd��Zedd��Zd�dd�Zed�dd��Zed�dd��Zed�dd��Zed�dd ��Zed!d"��Zed#d$��Zed�d%d&��Zed'd(��Zed)d*��Zed+d,��Zed�d-d.��Zed/d0��Zed1d2��Z ed�d4d5��Z!ed�d6d7��Z"ed�d8d9��Z#ed�d:d;��Z$ed�d<d=��Z%ed�d>d?��Z&ed�d@dA��Z'ed�dBdC��Z(ed�dDdE��Z)ed�dFdG��Z*edHdI��Z+edJdK��Z,ed�dLdM��Z-ed�dNdO��Z.ed�dPdQ��Z/ed�dRdS��Z0ed�dTdU��Z1edVdW��Z2ed�dXdY��Z3ed�dZd[��Z4ed�d\d]��Z5ed^d_��Z6ed�d`da��Z7ed�dbdc��Z8eddde��Z9ed�dfdg��Z:ed�dhdi��Z;ed�djdk��Z<edldm��Z=edndo��Z>ed�dpdq��Z?ed�drds��Z@ed�dtdu��ZAed�dvdw��ZBed�dxdy��ZCed�dzd{��ZDed�d|d}��ZEed�d~d��ZFed�d�d���ZGed�d���ZHed�d���ZIed�d���ZJed�d���ZKed�d���ZLed�d���ZMed�d�d���ZNed�d�d���ZOed�d���ZPed�d���ZQed�d���ZRed�d�d���ZSed�d�d���ZTed�d�d���ZUdS)�rZLSM_SIM_DATAz
/lsm_sim_datacCs2yt|tjd��Stk
r,|�YnXdS)N)rerPrh�
ValueError)Zlsm_idZ	lsm_errorrrr �_lsm_id_to_sim_id#szSimArray._lsm_id_to_sim_idcCstj|ttjd��S)Nz
Job not found)rrmrrr�)�job_idrrr �_sim_job_id_of*szSimArray._sim_job_id_ofcCstj|ttjd��S)NzPool not found)rrmrrr�)r�rrr �_sim_pool_id_of/szSimArray._sim_pool_id_ofcCstj|ttjd��S)NzVolume not found)rrmrrr�)r�rrr �_sim_vol_id_of4szSimArray._sim_vol_id_ofcCstj|ttjd��S)NzFile system not found)rrmrrr))r3rrr �
_sim_fs_id_of:szSimArray._sim_fs_id_ofcCstj|ttjd��S)NzFile system snapshot not found)rrmrrr4)�snap_idrrr �_sim_fs_snap_id_of@szSimArray._sim_fs_snap_id_ofcCstj|ttjd��S)NzFile system export not found)rrmrrrQ)r[rrr �_sim_exp_id_ofGszSimArray._sim_exp_id_ofcCstj|ttjd��S)NzFile system export not found)rrmrrrQ)r�rrr �
_sim_ag_id_ofNszSimArray._sim_ag_id_ofcCs4|dkrtj}t||�|_|jj�||_||_dS)N)r�
SIM_DATA_FILErPrr�rcrY)rkrcrYrrr rnUs
zSimArray.__init__NcCs|jj||�}dtj|fS)NzJOB_ID_%0*d)rr�rPrh)rkr�Zsim_data_idr�rrr �_job_create_szSimArray._job_createrc	Cs~tj|�}|jj|�\}}}tj}|dkr0tj}d}|tjkrJtj	|�}n*|tj
kr`tj|�}n|tjkrttj
|�}|||fS)Nr�)rrorr�rZ
INPROGRESSZCOMPLETErPr��_sim_vol_2_lsmr��
_sim_fs_2_lsmr��_sim_fs_snap_2_lsm)	rkrn�flagsr�r�r�r�rwr�rrr �
job_statusds




zSimArray.job_statuscCs*|jj�|jjtj|��|jj�dS)N)rr�r�rror�)rkrnr|rrr �job_freexs

zSimArray.job_freecCs"t|jtt|d���|_||_dS)Ni�)rPrcrerrrY)rkZmsr|rrr �time_out_setszSimArray.time_out_setcCs|jS)N)rY)rkr|rrr �time_out_get�szSimArray.time_out_getc	Cs0t|d|d|d|d|dtj|dd�S)Nrurvrwrxrory)Z_fw_version�_modeZ_read_cache_pct)rrPrg)�sim_sysrrr �_sim_sys_2_lsm�s
zSimArray._sim_sys_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rr�)r�r�rrr r��sz#SimArray.systems.<locals>.<genexpr>)r=rrp)rkrrr rt�szSimArray.systemscCsD|jtjkrttjd��|jj�|jjdtjd|�|jj	�dS)NzSystem not foundrtry)
rurPr�rr�NOT_FOUND_SYSTEMrr�r�r�)rk�systemZread_pctr|rrr �system_read_cache_pct_update�s

z%SimArray.system_read_cache_pct_updatec
Cs>t|d|d|dtjtt|dtj��|dtj|d�S)NZ
lsm_vol_idrvr}r{r��lsm_pool_id)rrPr�rerr�)r�rrr ry�s

zSimArray._sim_vol_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rry)r�r�rrr r��sz#SimArray.volumes.<locals>.<genexpr>)r=rr�)rkrrr r��szSimArray.volumesc

Cs^|d}|d}|d}|d}|d}|d}tj}|d}|d}	t||||	|||||�	S)	Nr�rvr{r�rwrxr�r�)rPr�r)
r�r�rvr{r�rwrx�sys_idr�r�rrr �_sim_pool_2_lsm�s
zSimArray._sim_pool_2_lsmcCs0|jj�|jj�}|jj�tdd�|D��S)Ncss|]}tj|�VqdS)N)rr�)r�r�rrr r��sz!SimArray.pools.<locals>.<genexpr>)rr�r�rr=)rkr|r�rrr r��s



zSimArray.poolsc
Csjtj}|ddkr|tjO}t|d|d|dtjtt|dtj��|tj|d|d|d|d	d
�S)Nr�r�rvr|r{r}r�r~r)Z_vpd83Z	_locationZ_rpmZ
_link_type)rr��STATUS_FREErPr�rerr�)�sim_diskZdisk_statusrrr �_sim_disk_2_lsm�s

zSimArray._sim_disk_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rr�)r�r�rrr r��sz!SimArray.disks.<locals>.<genexpr>)r=rr�)rkrrr rz�szSimArray.disksFc
CsT|dkr|jj�|jj||tj|�|d�}|r4|S|jtj|�}	|jj�|	dfS)z�
        The '_internal_use' parameter is only for SimArray internal use.
        This method will return the new sim_vol id instead of job_id when
        '_internal_use' marked as True.
        F)r�N)	rr�r�rrprxrPr�r�)
rkr�Zvol_namer�Zthinpr|�
_internal_use�_is_hw_raid_volZnew_sim_vol_idrnrrr �
volume_create�s


zSimArray.volume_createcCs2|jj�|jjtj|��|j�}|jj�|S)N)rr�r�rrqrxr�)rkr�r|rnrrr �
volume_delete�s


zSimArray.volume_deletecCsB|jj�tj|�}|jj||�|jtj|�}|jj�|dfS)N)	rr�rrqrrxrPr�r�)rkr�rr|r�rnrrr �
volume_resize�s



zSimArray.volume_resizec
Csj|jj�tj|�}|jj|�}|j|||dtjdd�}|jj|||�|j	t
j|�}	|jj�|	dfS)Nr{T)r�)
rr�rrpr�r�r�PROVISION_FULLrrxrPr�r�)
rkZdst_pool_idrrZnew_vol_namer|rZsrc_sim_volr�rnrrr �volume_replicate
s




zSimArray.volume_replicatecCs|tjkrttjd��tjS)NzSystem not found)rPr�rrr�r�)rkr�r|rrr �!volume_replicate_range_block_sizes

z*SimArray.volume_replicate_range_block_sizecCs>|jj�|jjtj|�tj|�||�|j�}|jj�|S)N)rr�rrrprxr�)rkrrr	Zrangesr|rnrrr �volume_replicate_range's

zSimArray.volume_replicate_rangecCs.|jj�|jjtj|�tj�|jj�dS)N)rr�rrrqrr�r�)rkr�r|rrr �
volume_enable9s


zSimArray.volume_enablecCs.|jj�|jjtj|�tj�|jj�dS)N)rr�rrrqrZADMIN_STATE_DISABLEDr�)rkr�r|rrr �volume_disableAs


zSimArray.volume_disablecCs4tj|�}|jj|�}x|D]}||krdSqWdS)NTF)rrqrr�)rkr�r|rr�rCrrr �volume_child_dependencyIs

z SimArray.volume_child_dependencycCs2|jj�|jjtj|��|j�}|jj�|S)N)rr�rrrqrxr�)rkr�r|rnrrr �volume_child_dependency_rmds

z#SimArray.volume_child_dependency_rmcCs(t|d|d|d|d|dtj�S)N�	lsm_fs_idrvr{r�r�)rrPr�)r/rrr rzoszSimArray._sim_fs_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rrz)r��frrr r�wszSimArray.fs.<locals>.<genexpr>)r=rr()rkrrr �fsuszSimArray.fscCsL|s|jj�|jj||tj|��}|r,|S|jtj|�}|jj�|dfS)N)	rr�r,rrprxrPr�r�)rkr�Zfs_namer�r|r�Z
new_sim_fs_idrnrrr �	fs_createys


zSimArray.fs_createcCs2|jj�|jjtj|��|j�}|jj�|S)N)rr�r.rrrrxr�)rkr3r|rnrrr �	fs_delete�s


zSimArray.fs_deletecCsBtj|�}|jj�|jj||�|jtj|�}|jj�|dfS)N)	rrrrr�r0rxrPr�r�)rkr3rr|r*rnrrr �	fs_resize�s


zSimArray.fs_resizecCs�|jj�d}|rtj|�}tj|�}|jj|�}|d}|j|||ddd�}	|jj||	|�|jt	j
|	�}
|jj�|
dfS)Nr�r{T)r�)rr�rrtrrr�r�rDrxrPr�r�)rkr@rFrsr|r5rBZ
src_sim_fsr�rCrnrrr �fs_clone�s





zSimArray.fs_clonecCsJ|jj�d}|rtj|�}|jjtj|�|||�|j�}|jj�|S)N)rr�rrtrGrrrxr�)rkr3rErFrsr|r5rnrrr �
fs_file_clone�s


zSimArray.fs_file_clonecCst|d|d|d�S)NZlsm_fs_snap_idrvr�)r	)r6rrr r{�szSimArray._sim_fs_snap_2_lsmcCs tdd�|jjtj|��D��S)Ncss|]}tj|�VqdS)N)rr{)r��srrr r��sz(SimArray.fs_snapshots.<locals>.<genexpr>)r=rr2rrr)rkr3r|rrr �fs_snapshots�szSimArray.fs_snapshotscCs>|jj�|jjtj|�|�}|jtj|�}|jj�|dfS)N)	rr�r8rrrrxrPr�r�)rkr3Z	snap_namer|r5rnrrr �fs_snapshot_create�s


zSimArray.fs_snapshot_createcCs:|jj�|jjtj|�tj|��|j�}|jj�|S)N)rr�r=rrtrrrxr�)rkr3rsr|rnrrr �fs_snapshot_delete�s

zSimArray.fs_snapshot_deletec	CsL|jj�d}|rtj|�}|jjtj|�||||�|j�}|jj�|S)N)rr�rrtr<rrrxr�)	rkr3rsr9r:r;r|r5rnrrr �fs_snapshot_restore�s


zSimArray.fs_snapshot_restorecCshtj|�}|dkr|jj�|jj|�gkrR|jj|�gkrR|dkrN|jj�dS|dkrd|jj�dS)NFT)rrrrr�r-r2r)rkr3r9r|r�r*rrr �fs_child_dependency�s



zSimArray.fs_child_dependencycCsb|jj�|j||dd�dkr*ttjd��tj|�}|jj|�|jj	|�|j
�}|jj�|S)z�
        Assuming API defination is break all clone relationship and remove
        all snapshot of this source file system.
        T)r�Fz9No snapshot or fs clone target found for this file system)rr�r�rrrrrrrHr>rxr�)rkr3r9r|rBrnrrr �fs_child_dependency_rm	s


zSimArray.fs_child_dependency_rmcCsBt|d|d|d|d|d|d|d|d|d	|d
�
S)NZ
lsm_exp_idr�rUrXrIrJrKrVrWrY)r
)rLrrr �_sim_exp_2_lsm	s
zSimArray._sim_exp_2_lsmcCsdd�|jj�D�S)NcSsg|]}tj|��qSr)rr�)r�rNrrr r�	sz$SimArray.exports.<locals>.<listcomp>)rrP)rkr|rrr �exports	szSimArray.exportsc

CsL|jj�|jjtj|�||||||||	�	}|jj|�}|jj�tj|�S)N)rr�r\rrrrSr�r�)
rkr3rUrIrJrKrVrWrXrYr|rRrLrrr �	fs_export!	s

zSimArray.fs_exportcCs*|jj�|jjtj|��|jj�dS)N)rr�r]rrur�)rkr[r|rrr �fs_unexport,	s

zSimArray.fs_unexportcCs"t|d|d|d|dtj�S)NZ	lsm_ag_idrvrr)rrPr�)rrrr �
_sim_ag_2_lsm3	szSimArray._sim_ag_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rr�)r�rrrr r�;	szSimArray.ags.<locals>.<genexpr>)r=rr)rkrrr r"9	szSimArray.agscCsP|tjkrttjd��|jj�|jj|||�}|jj|�}|jj	�t
j|�S)NzSystem not found)rPr�rrr�rr�r#r�r�rr�)rkrvrrr�r|Z
new_sim_ag_id�
new_sim_agrrr �access_group_create=	s


zSimArray.access_group_createcCs*|jj�|jjtj|��|jj�dS)N)rr�r$rrvr�)rkr�r|rrr �access_group_deleteI	s

zSimArray.access_group_deletecCsDtj|�}|jj�|jj|||�|jj|�}|jj�tj|�S)N)rrvrr�r%r�r�r�)rkr�rrr|r�r�rrr �access_group_initiator_addP	s


z#SimArray.access_group_initiator_addcCsBtj|�}|jj�|jj||�|jj|�}|jj�tj|�S)N)rrvrr�r&r�r�r�)rkr�rrr|r�rrrr �access_group_initiator_deleteY	s


z&SimArray.access_group_initiator_deletecCs2|jj�|jjtj|�tj|��|jj�dS)N)rr�rrrqrvr�)rkr�r�r|rrr �volume_maskc	s

zSimArray.volume_maskcCs2|jj�|jjtj|�tj|��|jj�dS)N)rr�rrrqrvr�)rkr�r�r|rrr �
volume_unmaskl	s

zSimArray.volume_unmaskcCs6|jj�|jjtj|�d�}|jj�dd�|D�S)N)r�cSsg|]}tj|��qSr)rry)r�r�rrr r�}	sz?SimArray.volumes_accessible_by_access_group.<locals>.<listcomp>)rr�r�rrvr)rkr�r|r�rrr �"volumes_accessible_by_access_groupu	s


z+SimArray.volumes_accessible_by_access_groupcCs6|jj�|jjtj|�d�}|jj�dd�|D�S)N)r�cSsg|]}tj|��qSr)rr�)r�rrrr r��	sz<SimArray.access_groups_granted_to_volume.<locals>.<listcomp>)rr�rrrqr)rkr�r|rrrr �access_groups_granted_to_volume	s


z(SimArray.access_groups_granted_to_volumecCs,|jj�|jj|||||�|jj�dS)N)rr�r!r�)rkrrrrr r|rrr �iscsi_chap_auth�	s


zSimArray.iscsi_chap_authcCs.t|d|d|d|d|d|dtj�S)NZ
lsm_tgt_idr�r�r�r�r�)r
rPr�)Zsim_tgtrrr �_sim_tgt_2_lsm�	s
zSimArray._sim_tgt_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rr�)r��trrr r��	sz(SimArray.target_ports.<locals>.<genexpr>)r=rr^)rkrrr �target_ports�	szSimArray.target_portscCs�|jjtj|jttjd���}tj	}t
j}|dtj
krH|jj|d�}|d}|d}|d}|}|t
jksx|t
jkr�|||||gS|t
jkr�ttjd|d��|t
jks�|t
jkr�tj	}nt|d	|�}|||||gS)
NzPool not foundr�r�rArBr�z;volume_raid_info(): Got unsupported RAID_TYPE_MIXED pool %sr�rC)rr�rrmr�rrr�rPr�rZOPT_IO_SIZE_UNKNOWNrr�ZRAID_TYPE_UNKNOWNr�ZRAID_TYPE_MIXEDrrIrGre)rk�lsm_volr�Zmin_io_sizeZopt_io_sizerArBr�rrr �volume_raid_info�	s4




zSimArray.volume_raid_infocCsp|jjtj|jttjd���}|d}g}|tj	kr@|dg}n"|tj
kr\|jj|d�}ntj}|d||fS)NzPool not foundr�Zparent_lsm_pool_idrurA)
rr�rrmrurrr�rr�r�r�ZMEMBER_TYPE_UNKNOWN)rkZlsm_poolr�r�Z
member_idsrrr �pool_member_info�	s

zSimArray.pool_member_infocCs$|jtjkrttjd��tjtjfS)NzSystem not found)rurPr�rrr�rjrk)rkr�rrr �volume_raid_create_cap_get�	sz#SimArray.volume_raid_create_cap_getc
Cs6|tjkrttjd��|tjkr(tj}n|tjkr>ttjd��|j	j
�d|}dd�|D�}x*|D]"}|jtj
@sdttjd|j��qdWy&|j	j|||tjtjtjB|d�}Wn4tjk
r�}	zttjd|��WYdd}	~	XnX|j	j|�}
|j|
d	||
d
dtjdd
d�}|j	j|�}|j	j�tj|�S)Nz%Provided 'raid_type' is not supportedz&Provided 'strip_size' is not supportedzPool for volume %scSs"g|]}tj|jttjd���qS)zDisk not found)rrmrurrZNOT_FOUND_DISK)r�r0rrr r��	sz/SimArray.volume_raid_create.<locals>.<listcomp>z'Disk %s is not in DISK.STATUS_FREE mode)rvrAr�r�r�r�z+Name '%s' is already in use by other volumer�r�iTr<)r�r�)rPrjrrrrZVCR_STRIP_SIZE_DEFAULTr�rkrr�rwrr�Z
DISK_NOT_FREErur�rr�r�r�rr�r�r�r�r�r�r�rry)
rkrvrArzr�Z	pool_namer�Zdiskr�rr�r�r�rrr �volume_raid_create�	sP






zSimArray.volume_raid_createcCs&tj|jttjd��}|jj|�}dS)NzVolume not found)rrmrurrr�rr�)rk�volumer|�
sim_volume_idr�rrr �volume_ident_led_on
szSimArray.volume_ident_led_oncCs&tj|jttjd��}|jj|�}dS)NzVolume not found)rrmrurrr�rr�)rkr�r|r�r�rrr �volume_ident_led_off
szSimArray.volume_ident_led_offcCs"t|d|d|d|dtj�S)NZ
lsm_bat_idrvrrw)rrPr�)�sim_batrrr �_sim_bat_2_lsm%
szSimArray._sim_bat_2_lsmcCstdd�|jj�D��S)Ncss|]}tj|�VqdS)N)rr�)r�r�rrr r�,
sz%SimArray.batteries.<locals>.<genexpr>)r=rr_)rkrrr r�*
szSimArray.batteriescCs�|jjtj|jttjd���}tj	}tj
}d}x$|jj�D]}|dtj
kr:d}q:W|dtjkrn|r�tj}n*|dtjkr�tj}n|dtjkr�tj}|dtjkr�tj}n|dtjkr�tj}|d||d||dgS)NzVolume not foundFrwTr�r�r�)rr�rrmrurrr�rZ WRITE_CACHE_STATUS_WRITE_THROUGHZREAD_CACHE_STATUS_DISABLEDr_rr�rhZWRITE_CACHE_STATUS_WRITE_BACKZWRITE_CACHE_POLICY_WRITE_BACKZWRITE_CACHE_POLICY_UNKNOWNZWRITE_CACHE_STATUS_UNKNOWNriZREAD_CACHE_STATUS_ENABLEDZREAD_CACHE_POLICY_UNKNOWNZREAD_CACHE_STATUS_UNKNOWN)rkr�r�Zwrite_cache_statusZread_cache_statusZflag_battery_okr�rrr �volume_cache_info.
s2


zSimArray.volume_cache_infocCs<|jj�tj|jttjd��}|jj||�|jj	�dS)NzVolume not found)
rr�rrmrurrr�rar�)rkr�r`r|r�rrr �!volume_physical_disk_cache_updateP
s

z*SimArray.volume_physical_disk_cache_updatecCs<|jj�tj|jttjd��}|jj||�|jj	�dS)NzVolume not found)
rr�rrmrurrr�rer�)rkr�rdr|r�rrr � volume_write_cache_policy_updateY
s

z)SimArray.volume_write_cache_policy_updatecCs<|jj�tj|jttjd��}|jj||�|jj	�dS)NzVolume not found)
rr�rrmrurrr�rcr�)rkr�rbr|r�rrr �volume_read_cache_policy_updateb
s

z(SimArray.volume_read_cache_policy_update)NN)r)r)r)r)r)r)rFr)r)r)r)r)r)r)r)r)r)rF)r)r)r)r)r)r)r)rF)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)r)VrDrErFr[r��tempfileZ
gettempdirrwrOrmrorprqrrrtrurvr"rnrxr}r~rr�r�rtr�ryr�r�r�r�rzr�r�r�r�r�r�r�r�r�r�rzr�r�r�r�r�r�r{r�r�r�r�r�r�r�r�r�r�r�r"r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr rs�



		
		&
4		"r)r(r�r[r�rZlsmrrrrrrrr	r
rrr
rrrrr"r+r3�objectr4rPrrrrr �<module>s2D
8)

NineSec Team - 2022