Mini Shell

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

3

�Mf�X�@sPddlmZddlmZddlmZddlmZddlmZddlmZddlZddl	Z	ddl
Z
ddlZddlZdd	l
mZddlZejd
d�ddlmZddlZejd
�ZdadZdddgZdZdZdZdZedZedZdd�Zedddg�Z Gdd�de!�Z"Gd d!�d!e!�Z#d"d#�Z$Gd$d%�d%ej%�Z&e&�Z'Gd&d'�d'e!�Z(e(�Z)dS)(�)�errors)�udev)�util)�flags)�_)�	safe_dbus�N)�
namedtuple�GLibz2.0)r
Zblivet�z/etc/iscsi/initiatorname.iscsiZcxgb3iZbnx2iZbe2iscsizorg.freedesktop.UDisks2z/org/freedesktop/UDisks2z /org/freedesktop/UDisks2/Managerzorg.freedesktop.UDisks2.Managerz.ISCSI.Initiatorz.ISCSI.SessioncCs<tjdtj�sdSts8tjd�}|s(dS|atjdt�dS)Nz/sys/module/iscsi_tcpF�iscsidzISCSID is %sT)�os�access�X_OK�ISCSID�shutil�which�log�info)�location�r�/usr/lib/python3.6/iscsi.py�	has_iscsi8s
r�
TargetInfo�ipaddr�portc@s$eZdZdZdd�Zedd��ZdS)�NodeInfoz*Simple representation of node information.cCs:||_||_||_||_||_d|_d|_d|_d|_dS)N)	�name�tpgt�addressr�iface�username�password�
r_username�
r_password)�selfrrrrr rrr�__init__MszNodeInfo.__init__cCs|j|j|j|j|jfS)zrThe 5-tuple of connection info (no auth info). This form
        is useful for interacting with storaged.
        )rrrrr )r%rrr�	conn_infoYszNodeInfo.conn_infoN)�__name__�
__module__�__qualname__�__doc__r&�propertyr'rrrrrKsrc@seZdZdd�ZdS)�	LoginInfocCs||_||_dS)N)�node�	logged_in)r%r.r/rrrr&bszLoginInfo.__init__N)r(r)r*r&rrrrr-asr-cCsdd�|D�S)zETransforms an 'a(sisis)' GLib.Variant into a list of NodeInfo objectscSsg|]}t|��qSr)r)�.0rrrr�
<listcomp>isz"_to_node_infos.<locals>.<listcomp>r)Zvariantrrr�_to_node_infosgsr2c@seZdZdZdd�ZdS)�iSCSIDependencyGuardz*storaged iSCSI functionality not availablecCsVy0tjttt�sdStjtttdtjdd��Wntjk
rFdSXtjttt	�S)NFZ
EnableModulesz(b)T)T)
rZcheck_object_available�STORAGED_SERVICE�STORAGED_MANAGER_PATH�
MANAGER_IFACE�	call_syncr
�Variant�
DBusCallError�INITIATOR_IFACE)r%rrr�_check_availos
z!iSCSIDependencyGuard._check_availN)r(r)r*Z	error_msgr;rrrrr3lsr3c@sbeZdZdZdd�Zdd�Zdd�Zeede	j
jd	�d
d���Zedd
��Z
ede	j
jd	�d8dd��Zedd��Zeede	j
jd	�dd���Zejede	j
jd	�dd���Zd9dd�Zedd��Zd:dd�Zd;dd�Zede	j
jd	�dd ��Zede	j
jd	�d!d"��Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd<d,d-�Zd=d.d/�Zd>d0d1�Zd?d2d3�Zd4d5�Z d6d7�Z!dS)@�iSCSIa� iSCSI utility class.

        This class will automatically discover and login to iBFT (or
        other firmware) configured iscsi devices when the startup() method
        gets called. It can also be used to manually configure iscsi devices
        through the add_target() method.

        As this class needs to make sure certain things like starting iscsid
        and logging in to firmware discovered disks only happens once
        and as it keeps a global list of all iSCSI devices it is implemented as
        a Singleton.

        .. warning::
            Since this is a singleton class, calling deepcopy() on the instance
            just returns ``self`` with no copy being created.
    cCs�i|_g|_d|_d|_i|_d|_tjr�y|jd�d}||_Wn2t	k
rt}zt
jdt|��WYdd}~Xn,Xt
jd|j
�tjd|df�}|jd|�dS)	NrFZGetFirmwareInitiatorNamerz4failed to get initiator name from iscsi firmware: %sz+Setting up firmware iSCSI initiator name %sz(sa{sv})�SetInitiatorName)�discovered_targets�
ibft_nodes�
_initiator�started�ifaces�_iSCSI__connectionr�ibft�_call_initiator_method�	Exceptionrr�str�	initiatorr
r8)r%Z
initiatorname�e�argsrrrr&�s
"ziSCSI.__init__cCs|S)Nr)r%rrr�__call__�sziSCSI.__call__cCs|S)Nr)r%Z	memo_dictrrr�__deepcopy__�sziSCSI.__deepcopy__F)ZcriticalZ	eval_modecCsdS)NTr)r%rrr�	available�sziSCSI.availablecCs|jstj�|_|jS)N)rCrZget_new_system_connection)r%rrr�_connection�s
ziSCSI._connectionTNcCstjttt|||jd�S)z�Class a method of the ISCSI.Initiator DBus object

        :param str method: name of the method to call
        :param params: arguments to pass to the method
        :type params: GLib.Variant

        )Z
connection)rr7r4r5r:rN)r%�methodrJrrrrE�s	ziSCSI._call_initiator_methodcCs
|jdkS)z&True if initiator is set at our level.r)r@)r%rrr�
initiator_set�sziSCSI.initiator_setcCs8|jdkr|jSt|jd�ddd��}|jddd�S)	NrZGetInitiatorNameRawrrzutf-8�replace)r���)r@�bytesrE�decode)r%Z
raw_initiatorrrrrH�s
ziSCSI.initiatorcCs�t|�dkrttd���|j�}|r2tjtd���tjd|j�t	j
d|df�}|jd|�|jr�||j
kr�tjd�tjdd	d
g�}|dkr�tjtd���||_
dS)Nrz$Must provide an iSCSI initiator namez3Cannot change initiator name with an active sessionz"Setting up iSCSI initiator name %sz(sa{sv})r=z-Restarting iscsid after initiator name change�	systemctlZrestartrz4Failed to restart iscsid after initiator name change)�len�
ValueErrorr�_get_active_sessionsr�
ISCSIErrorrrrHr
r8rErPr@r�run_program)r%�val�activerJ�rcrrrrH�s
cCsD|rdd�|jj|g�D�Sdd�tjt|jj���D�|jSdS)zNodes logged in tocSsg|]}|jr|j�qSr)r/r.)r0rrrrr1�sz&iSCSI.active_nodes.<locals>.<listcomp>cSsg|]}|jr|j�qSr)r/r.)r0rrrrr1�sN)r>�get�	itertools�chain�list�valuesr?)r%�targetrrr�active_nodes�sziSCSI.active_nodescCs|j�sdS|jrdSdSdS)NZnoneZbind�default)rdrB)r%rrr�mode�s
z
iSCSI.modecCs:x4|jj�D]&}x |D]}|j|kr||_dSqWqWdS)zMMark node as one logged in to

           Returns False if not found
        TF)r>rbr.r/)r%r.r\Zlogin_infosrrrr�_mark_node_actives

ziSCSI._mark_node_activecCsB|dkrt�}tjdd�|d<tjd|j|f�}|jd|�dS)z�Try to login to the iSCSI node

        :type node_info: :class:`NodeInfo`
        :param dict extra: extra configuration for the node (e.g. authentication info)
        :raises :class:`~.safe_dbus.DBusCallError`: if login fails

        N�sZ	automaticznode.startupz(sisisa{sv})ZLogin)�dictr
r8r'rE)r%Z	node_infoZextrarJrrr�_login
s
	ziSCSI._logincCs�ytjttddd�d}Wn2tjk
rL}ztjdt|��gSd}~XnXdd�|j�D�}g}x>|D]6}||t	}|j
t|d|d|d	|d
d��qjW|S)Nz"org.freedesktop.DBus.ObjectManagerZGetManagedObjectsrz(iscsi: Failed to get active sessions: %scss|]}tjd|�r|VqdS)z.*/iscsi/session[0-9]+$N)�re�match)r0�objrrr�	<genexpr>)sz-iSCSI._get_active_sessions.<locals>.<genexpr>Ztarget_namerZpersistent_addressZpersistent_port)rr7r4�
STORAGED_PATHr9rrrG�keys�
SESSION_IFACE�appendr)r%ZobjectsrIZsessionsr\ZsessionZ
propertiesrrrrXs&
ziSCSI._get_active_sessionsc s6tjs
dStjdgf�}y|jd|�\}}Wn2tjk
r^}ztjdt	|��dSd}~XnXt
|�}|j�}x�|D]��t�fdd�|D��r�tjd�j
�j�j�j�|jj��y4|j��tjd�j
�j�j�j�|jj��Wqvtjk
�r$}ztjd�j
t	|��WYdd}~XqvXqvW|j�dS)	Nz(a{sv})ZDiscoverFirmwareziscsi: No IBFT info found: %sc3s>|]6}�j|jko4�j|jko4�j|jko4�j|jkVqdS)N)rrrr)r0�a)r.rrrnFsz$iSCSI._start_ibft.<locals>.<genexpr>z9iscsi IBFT: already logged in node %s at %s:%s through %sz.iscsi IBFT: logged into %s at %s:%s through %sz+Could not log into ibft iscsi target %s: %s)rrDr
r8rErr9rrrGr2rX�anyrrrr r?rrrj�error�	stabilize)r%rJ�found_nodes�_n_nodesrIrdr)r.r�_start_ibft6s2


$ziSCSI._start_ibftcCstjd�tj�dS)N�)�time�sleeprZsettle)r%rrrrvVs
ziSCSI.stabilizecCslxf|D]^}dt|j�}tjdddd|dg�tjdddd|ddd	d
|g
�||j|<tjd||�qWdS)Nziface%d�iscsiadmz-mr z-Iz--op=newz--op=updatez-nziface.net_ifacenamez-vzcreated_interface %s:%s)rVrBrrZr�debug)r%rBr �iscsi_iface_namerrr�create_interfaces^s



ziSCSI.create_interfacescCs:|js
dSx$|jD]}tjdddd|dg�qWi|_dS)Nr}z-mr z-Iz--op=delete)rBrrZ)r%rrrr�delete_interfacesls
ziSCSI.delete_interfacescCs�|jr
dSt�sdStjdddg�|jdkr<tjd�dSx.dd�dD�D]}tjj	|�sLtj
|d�qLWtjd�tjddgt�tj
d�}|r�tjd|�tj|g�n
tjd�tjtg�tjd�|j�d|_dS)NrU�startziscsi-init.servicerzno initiator setcss|]}tjjd|�VqdS)z/var/lib/iscsiN)r
�path�join)r0�drrrrn�sz iSCSI.startup.<locals>.<genexpr>rB�isns�nodes�send_targets�slp�statici�z
iSCSI startupZmodprobez-a�iscsiuioziscsi: iscsiuio is at %sziscsi: iscsiuio not found.rT)rBr�r�r�r�r�)rArrrZr@rrr
r��isdir�makedirs�
ISCSI_MODULESrrr~rr{r|ry)r%Zfulldirr�rrr�startupus.





z
iSCSI.startup�3260cCs6t�stjtd���|jdkr*ttd���|jt||��rJtj	d||�n�|j
�t�}|rltj
d|�|d<|r�tj
d|�|d<|r�tj
d|�|d<|r�tj
d|�|d	<tj
d
|t|�|f�}|jd|�\}	}
t|	�}t||�}g|j|<x0|D](}
|j|jt|
d��tj	d
|
j�q�Wdd�|jt||�D�S)a�
        Discover iSCSI nodes on the target available for login.

        If we are logged in a node discovered for specified target
        do not do the discovery again as it can corrupt credentials
        stored for the node (set_auth and get_auth are using database
        in /var/lib/iscsi/nodes which is filled by discovery). Just
        return nodes obtained and stored in the first discovery
        instead.

        Returns list of nodes user can log in.
        ziSCSI not availablerzNo initiator name setz6iSCSI: skipping discovery of %s:%s due to active nodesrhr!r"zreverse-usernamezreverse-passwordz	(sqa{sv})ZDiscoverSendTargetsFzdiscovered iSCSI node: %scSsg|]}|js|j�qSr)r/r.)r0rrrrr1�sz"iSCSI.discover.<locals>.<listcomp>)rrrYrr@rWrdrrr~r�rir
r8�intrEr2r>rrr-r)r%rrr!r"r#r$�	auth_inforJr�rxrwZt_infor.rrr�discover�s4




ziSCSI.discoverc
Csd}d}t�}|r"tjd|�|d<|r6tjd|�|d<|rJtjd|�|d<|r^tjd|�|d<yj|j||�d}tjd	|j|j|j|j	�|j
|�s�tjd
�|r�||_|r�||_
|r�||_|r�||_Wn>tjk
�r}	zt|	�}tjd|j|�WYdd}	~	XnX||fS)
aQ
        :param node: node to log into
        :type node: :class:`NodeInfo`
        :param str username: username to use when logging in
        :param str password: password to use when logging in
        :param str r_username: r_username to use when logging in
        :param str r_password: r_password to use when logging in
        Frrhr!r"zreverse-usernamezreverse-passwordTz)iSCSI: logged into %s at %s:%s through %sz&iSCSI: node not found among discoveredz iSCSI: could not log into %s: %sN)rir
r8rjrrrrrr rgrur!r"r#r$rr9rGZwarning)
r%r.r!r"r#r$r]�msgr�rIrrr�
log_into_node�s<


"ziSCSI.log_into_nodec
Cs�d}
d}|j|||	|
||�}|dkr2tjtd���x�|D]|}|rZ||jkrZtjd|j�q8|r�|jj|j	|j	�}||kr�tjd|j|�q8|
d}
|j
|||||�\}}|r8|d}q8W|
dkr�tjtd���|dkr�tjtd���|j�dS)	a�
        Connect to iSCSI server specified by IP address and port
        and add all targets found on the server and authenticate if necessary.
        If the target parameter is set, connect only to this target.

        NOTE: the iSCSI target can have two sets of different authentication
              credentials - one for discovery and one for logging into nodes

        :param str ipaddr: target IP address
        :param str port: target port
        :param user: CHAP username for node login
        :type user: str or NoneType
        :param pw: CHAP password for node login
        :type pw: str or NoneType
        :param user_in: reverse CHAP username for node login
        :type user: str or NoneType
        :param pw_in: reverse CHAP password for node login
        :type pw_in: str or NoneType
        :param target: only add this target (if present)
        :type target: str or NoneType
        :param iface: interface to use
        :type iface: str or NoneType
        :param discover_user: CHAP username for discovery
        :type discover_user: str or NoneType
        :param discover_pw: CHAP password for discovery
        :type discover_pw: str or NoneType
        :param discover_user_in: reverse CHAP username for discovery
        :type discover_user: str or NoneType
        :param discover_pw_in: reverse CHAP password for discovery
        :type discover_pw_in: str or NoneType
        rNzNo iSCSI nodes discoveredz*iscsi: skipping logging to iscsi node '%s'z1iscsi: skipping logging to iscsi node '%s' via %srzNo new iSCSI nodes discoveredz/Could not log in to any of the discovered nodes)r�rrYrrrr~rBr^r r�rv)r%rr�userZpwZuser_inZpw_inrcr Z
discover_userZdiscover_pwZdiscover_user_inZdiscover_pw_in�foundr/rwr.Znode_net_ifacer]Z_msgrrr�
add_target�s2$

ziSCSI.add_targetcCs||js
dStjj|d�r(tj|d�tjjd�rHtjd|ddd�tjj|d�shtj|dd�tjt	|t	�dS)Nz/var/lib/iscsiT)Zsymlinksz
/etc/iscsii�)
rPr
r�r�rZrmtreeZcopytreer�Zcopyfile�INITIATOR_FILE)r%�root�storagerrr�write=sziSCSI.writecCsFx@|j�D]4}|j|kr
|j|kr
|jt|�kr
|j|kr
|Sq
WdS)N)rdrrrr�r )r%rrrr r.rrr�get_nodeMs
ziSCSI.get_nodecCs:g}dd�|jD�}x |D]}|j|kr|j|�qW|S)Ncss|]}|jdkr|VqdS)�iscsiN)�type)r0r�rrrrnWsz'iSCSI.get_node_disks.<locals>.<genexpr>)Zdevicesr.rr)r%r.r�Z
node_disksZiscsi_disksZdiskrrr�get_node_disksUs

ziSCSI.get_node_disks)N)N)T)N)r�NNNN)NNNN)r�NNNNNNNNNN)N)"r(r)r*r+r&rKrLr,�storaged_iscsi_requiredrZEvalModeZonetimerMrNrErPrH�setterrdrfrgrjrXryrvr�r�r�r�r�r�r�r�r�rrrrr<sF	
		

 	%
0
,
B
r<)*rrrrrZi18nrrr
rkrr{r_�collectionsr	ZgiZrequire_versionZ
gi.repositoryr
ZloggingZ	getLoggerrrr�r�r4ror5r6r:rqrr�objectrr-r2ZDependencyGuardr3r�r<r�rrrr�<module>sL

d