
    -_g>                     F    d dl Z d dlmZ d dlmZ d dlmZ  G d de      Zy)    N)ElementTree)Cluster)sos_parse_versionc                   >    e Zd ZdZd gZdZdZg dZd Zd Z	d Z
d Zy	)
	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                    g | _         	 | j                  d      s	 | j                          | j                   s| j                          | j                   D cg c]	  }d|vs| }}|r$| j	                  ddj                  |       d       | j                   S # t        $ r}| j	                  d|        Y d }~d }~ww xY w# t        $ r}| j                  d|        Y d }~d }~ww xY wc c}w )Nr
   zHFalling back to sourcing corosync.conf. Could not parse crm_mon output: z(Could not determine nodes from cluster: .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n_shortss       B/usr/lib/python3/dist-packages/sos/collector/clusters/pacemaker.py	get_nodeszpacemaker.get_nodes   s    
	M???3L++- :: ,,. #jj9CqL199MM+CHHW,=+> ?* * zz% ! LMM #EEHE#K L LL  	MNNEcUKLL	M :sK   C B C 	C+C+	B> B94C 9B>>C 	C(
C##C(c                 &   d}| j                  d      }|d   dk(  rB|d   j                         d   j                  d      d   }t        |      t        d      k  rd	}ny
| j                  d| d      }|d   dk(  r| j                  |d          y
y
)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_outs        r   r   zpacemaker.get_nodes_from_crm9   s     #$$%89>Q>'')!,2237:D &*;G*DD#$$,VH5 % 
 >QtH~.     c                 X   t        j                  |      }|j                  d      }|D ]  }|j                  }| j	                  d      r'|d   dk(  r| j
                  j                  |d          G| j	                  d      sY|d   dk(  sb| j
                  j                  |d           y)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_nodes         r   r$   zpacemaker.parse_crm_xmlM   s     %%i0		'" 	1DKKEx(U8_-F

!!%-0+h70J

!!%-0	1r)   c                     | j                  d       | j                  j                  d      }t        j                  d|      }|D ].  }| j
                  j                  |d   j                                0 y)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   r1   strip)r   ccr   r4   s       r   r   z!pacemaker.get_nodes_from_corosyncZ   si    
 	 G 	H\\##$AB

3R8 	0DJJd2hnn./	0r)   N)__name__
__module____qualname__cluster_namesos_pluginspackagesstrict_node_listoption_listr   r   r$   r    r)   r   r   r      s4    @L-KHK6/(1
0r)   r   )r:   	xml.etreer   sos.collector.clustersr   sos.utilitiesr   r   rF   r)   r   <module>rJ      s!    
 ! * +R0 R0r)   