o
    O6ufA  ã                   @   s@   d dl Z d dlmZ d dlmZ d dlmZ G dd„ deƒZdS )é    N)ÚElementTree)ÚCluster)Úsos_parse_versionc                   @   sF   e Zd ZdZd gZdZdZg d¢Zdd„ Zdd„ Z	d	d
„ Z
dd„ ZdS )Ú	pacemakerz+Pacemaker High Availability Cluster Manager)r   T))ÚonlineTzCollect nodes listed as online)ÚofflineTzCollect nodes listed as offline)úonly-corosyncFz)Only use corosync.conf to enumerate nodesc              
   C   sÌ   g | _ z/|  d¡s*z|  ¡  W n ty) } z|  d|› �¡ W Y d }~nd }~ww | j s1|  ¡  W n tyL } z|  d|› �¡ W Y d }~nd }~ww dd„ | j D ƒ}|rc|  dd |¡› d�¡ | j S )	Nr   zHFalling back to sourcing corosync.conf. Could not parse crm_mon output: z(Could not determine nodes from cluster: c                 S   s   g | ]}d |vr|‘qS )Ú.© )Ú.0Únr
   r
   úB/usr/lib/python3/dist-packages/sos/collector/clusters/pacemaker.pyÚ
<listcomp>/   s    z'pacemaker.get_nodes.<locals>.<listcomp>zWARNING: Node addresses 'ú,z“' may not resolve locally if you are not running on a node in the cluster. Try using option '-c pacemaker.only-corosync' if these connections fail.)ÚnodesÚ
get_optionÚget_nodes_from_crmÚ	ExceptionÚlog_warnÚget_nodes_from_corosyncÚ	log_errorÚjoin)ÚselfÚerrÚ_shortsr
   r
   r   Ú	get_nodes   s0   
ÿ€ÿ€€ÿÿzpacemaker.get_nodesc                 C   s„   d}|   d¡}|d dkr%|d  ¡ d  d¡d }t|ƒtdƒks$d	}nd
S | j d|› �dd�}|d dkr@|  |d ¡ d
S d
S )zG
        Try to parse crm_mon output for node list and status.
        z--output-as=xmlzcrm_mon --versionÚstatusr   Úoutputé   ú-z2.0.3z--as-xmlNzcrm_mon --one-shot --inactive T)Ú	need_root)Úexec_primary_cmdÚsplitr   Úparse_crm_xml)r   ÚxmloptÚ_verÚcverÚ_outr
   r
   r   r   9   s   
€þÿzpacemaker.get_nodes_from_crmc                 C   sv   t  |¡}| d¡}|D ],}|j}|  d¡r%|d dkr%| j |d ¡ q|  d¡r8|d dkr8| j |d ¡ qdS )zA
        Parse the xml output string provided by crm_mon
        r   r   ÚtrueÚnamer   ÚfalseN)r   Ú
fromstringÚfindÚattribr   r   Úappend)r   Ú	xmlstringÚ_xmlr   ÚnodeÚ_noder
   r
   r   r#   M   s   

€ûzpacemaker.parse_crm_xmlc                 C   sD   |   d¡ | j d¡}t d|¡}|D ]}| j |d  ¡ ¡ qdS )z¥
        As a fallback measure, read corosync.conf to get the node list. Note
        that this prevents us from separating online nodes from offline nodes.
        z_WARNING: unable to distinguish online nodes from offline nodes when sourcing from corosync.confz/etc/corosync/corosync.confz((\sring0_addr:)(.*))éÿÿÿÿN)r   ÚprimaryÚ	read_fileÚreÚfindallr   r.   Ústrip)r   Úccr   r1   r
   r
   r   r   Z   s   
ÿz!pacemaker.get_nodes_from_corosyncN)Ú__name__Ú
__module__Ú__qualname__Úcluster_nameÚsos_pluginsÚpackagesÚstrict_node_listÚoption_listr   r   r#   r   r
   r
   r
   r   r      s    r   )r6   Ú	xml.etreer   Úsos.collector.clustersr   Úsos.utilitiesr   r   r
   r
   r
   r   Ú<module>   s
   
