o
    O6uf©*  ã                   @   s†   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 dZdZdZG dd„ deƒZG d	d
„ d
eeƒZG dd„ dee	eƒZdS )é    )Ú	translateN)ÚPluginÚRedHatPluginÚDebianPluginÚUbuntuPluginÚ	PluginOpt)ÚkubeletÚ
kubernetes)r   zkube-apiserverz
kube-proxyzkube-schedulerzkube-controller-manager)z/etc/kubernetes/admin.confc                	   @   s¦   e Zd ZdZdZdZdZddgZg d¢Zg d¢Z	e
d	d
dd�e
dd
dd�e
dd
dd�e
ddedd�gZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$S )%Ú
Kubernetesz+Kubernetes container orchestration platformr	   )Ú	containeri°  z/etc/kubernetesz/run/flannel)ÚeventsÚdeploymentsÚ	ingressesÚpodsÚpvcÚservicesÚ
daemonsetsÚreplicasetsÚ	endpointsÚstatefulsetsÚ
configmapsÚserviceaccountsÚsecretsÚjobsÚcronjobsÚclusterrolesÚclusterrolebindingsÚlimitrangesÚresourcequotas)ÚscÚpvÚrolesÚrolebindingsÚallFz'collect all namespace output separately)ÚdefaultÚdescÚdescribez(collect describe output of all resourcesÚpodlogsz$capture stdout/stderr logs from podsúpodlogs-filterÚ z1only collect logs from pods matching this pattern)r$   Úval_typer%   Úkubectlc                 C   sD   t j d¡rd S | jD ]}|  |¡r|  jd|› �7  _ d S qd S )NÚ
KUBECONFIGz --kubeconfig=)ÚosÚenvironÚgetÚfilesÚpath_existsÚkube_cmd)ÚselfÚ_kconf© r5   ú?/usr/lib/python3/dist-packages/sos/report/plugins/kubernetes.pyÚset_kubeconfig]   s   

þÿzKubernetes.set_kubeconfigc                    s   t ‡ fdd„ˆ jD ƒƒS )z" Check if this is the master node c                 3   s   � | ]}ˆ   |¡V  qd S ©N)r1   )Ú.0Úf©r3   r5   r6   Ú	<genexpr>g   s   € z-Kubernetes.check_is_master.<locals>.<genexpr>)Úanyr0   r;   r5   r;   r6   Úcheck_is_mastere   s   zKubernetes.check_is_masterc                    sn  ˆ   ˆ j¡ ˆ  g d¢¡ ˆ  ¡ sd S dD ]}ˆ jˆ j› d|› �dd� qˆ  d¡r:ˆ j‡ fdd„ˆ jD ƒdd� nˆ j‡ fd	d„ˆ jD ƒdd� ˆ jˆ j› d
�dd�}|d dkr„ˆ  d¡r„|d  	¡ dd … D ]}| 
¡ }|srqi|d }ˆ jˆ j› d|› �dd� qiˆ jˆ j› d�gdd� ˆ jˆ j› d�dd� ˆ  d¡r­ˆ j ddg¡ ˆ  d¡ ˆ  ¡  ˆ  ¡  d S )N)r,   ÚKUBERNETES_HTTP_PROXYÚKUBERNETES_HTTPS_PROXYÚKUBERNETES_NO_PROXY)Úversionzconfig viewú úcluster-info©Úsubdirr#   c                    ó   g | ]
}ˆ j › d |› �‘qS )ú get -o json ©r2   ©r9   Úresr;   r5   r6   Ú
<listcomp>~   ó    ÿÿz$Kubernetes.setup.<locals>.<listcomp>c                    rG   )ú get rI   rJ   r;   r5   r6   rL   ƒ   rM   z
 get nodesÚstatusr   r&   Úoutputé   z describe node z get -o json nodesz get --raw /metricszkubevirt-virtctlÚvmsÚvmiszvirtctl version)Úadd_copy_specÚconfig_filesÚadd_env_varr>   Úadd_cmd_outputr2   Ú
get_optionÚglobal_resourcesÚcollect_cmd_outputÚ
splitlinesÚsplitÚis_installedÚ	resourcesÚextendÚcollect_per_resource_detailsÚcollect_all_resources)r3   ÚsubcmdÚnodesÚlineÚwordsÚnoder5   r;   r6   Úsetupi   s^   þ
þýþýÿþ
ÿþ
þ

zKubernetes.setupc              	   C   sZ  | j | j› d�dd�}|d  ¡ dd… }dd„ |D ƒ}|D ]Œ}d	|› �}|  d
¡rG| j› d|› �}| jD ]}| j|› d|› �d|› �d� q5|  d¡r | j› d|› �}| jD ]H}|dkr^qW|  |› d|› �¡}|d dkrŸdd„ |d  ¡ dd… D ƒ}	|	D ]}
| j› d|› �}| j|› d|› d|
› �d|› d|› �d� qqW|  d¡rª|  |¡ qdS )z7 Collect details about each resource in all namespaces z get namespacesrD   rE   rP   rQ   Nc                 S   s(   g | ]}|rt | ¡ ƒr| ¡ d  ‘qS ©r   )Úlenr\   )r9   Únr5   r5   r6   rL   °   s   ( z;Kubernetes.collect_per_resource_details.<locals>.<listcomp>z--namespace=r#   rH   rC   úcluster-info/r&   r   rN   rO   r   c                 S   s   g | ]}|  ¡ d  ‘qS rh   )r\   )r9   Úkr5   r5   r6   rL   Å   s    z
 describe ú/r'   )rZ   r2   r[   rX   r^   rW   Úexec_cmdÚ_get_pod_logs)r3   ÚknsÚ	kn_outputÚknspsÚnspaceÚknspÚk_cmdrK   ÚretÚk_listÚitemr5   r5   r6   r`   ©   sF   ÿ


þ

ÿþ€

€ãz'Kubernetes.collect_per_resource_detailsc              
   C   sV  | j › d|› �}|  |› d�¡}|d dkr§t |d ¡}|  d¡r)t|  d¡ƒnd }|d D ]y}|r>t ||d d	 ¡s>q/d
|d d › d|d d	 › �}d|d v rz|d d D ]}|d d	 }	|d	 }
| j| j › d|› d|	› d|
› �|d� qZd|d v r¦|d d D ]}|d d	 }	|d	 }
| j| j › d|› d|	› d|
› �|d� q†q/d S d S )NrH   z podsrO   r   rP   r(   ÚitemsÚmetadataÚnamerk   Ú	namespacez	/podlogs/Ú
containersÚspecrC   z logs z -c rE   ÚinitContainers)	r2   rn   ÚjsonÚloadsrX   r   ÚreÚmatchrW   )r3   r|   ru   rv   r   ÚregÚpodÚ_subdirÚcontÚpod_nameÚ	cont_namer5   r5   r6   ro   Ñ   sV   ÿÿ
ÿ
þÿÿýÿÿý€èzKubernetes._get_pod_logsc                 C   sB   |   d¡s| j› d�}| jD ]}| j|› d|› �dd� qdS dS )z% Collect details about all resources r#   z get --all-namespaces=truerC   rD   rE   N)rX   r2   r^   rW   )r3   ru   rK   r5   r5   r6   ra   ò   s   

þýz Kubernetes.collect_all_resourcesc                 C   sv   d}|   | j|d¡ |  | j¡ dd | j¡› d�}|  |¡ d}d}dd t| jƒ| j ¡› d�}|  |||¡ d S )NzX(?P<var>{\s*"name":\s*[^,]*(pass|pwd|key|token|cred|PASS|PWD|KEY)[^,]*,\s*"value":)[^}]*z\g<var> "********"z^(ú|ú)zLS0tLS1CRUdJ[A-Za-z0-9+/=]+z***** SCRUBBED BASE64 PEM *****)	Údo_cmd_output_subr2   Údo_cmd_private_subÚjoinrU   Údo_file_private_subÚlistr0   Údo_path_regex_sub)r3   Ú
env_regexpÚpathexpÚregexpÚsubstr5   r5   r6   Úpostprocü   s   
ÿ
zKubernetes.postprocN)Ú__name__Ú
__module__Ú__qualname__Ú
short_descÚplugin_nameÚprofilesÚplugin_timeoutrU   r^   rY   r   ÚstrÚoption_listr2   r7   r>   rg   r`   ro   ra   r–   r5   r5   r5   r6   r
   &   s>    þÿÿÿÿù@(!
r
   c                       s4   e Zd ZeZeZeZ‡ fdd„Z	‡ fdd„Z
‡  ZS )ÚRedHatKubernetesc                    s   |   d¡rdS tƒ  ¡ S )Nzopenshift-hyperkubeF)r]   ÚsuperÚcheck_enabledr;   ©Ú	__class__r5   r6   r¢     s   

zRedHatKubernetes.check_enabledc                    s   |   ¡  tƒ  ¡  d S r8   )r7   r¡   rg   r;   r£   r5   r6   rg   "  s   zRedHatKubernetes.setup)r—   r˜   r™   ÚKUBE_PACKAGESÚpackagesÚKUBECONFIGSr0   Ú	KUBE_SVCSr   r¢   rg   Ú__classcell__r5   r5   r£   r6   r      s    r    c                       s0   e Zd ZeZed Zed Z‡ fdd„Z	‡  Z
S )ÚUbuntuKubernetes)z#/root/cdk/cdk_addons_kubectl_configz4/var/snap/microk8s/current/credentials/client.config)zsnap.kubelet.daemonzsnap.kube-apiserver.daemonzsnap.kube-proxy.daemonzsnap.kube-scheduler.daemonz#snap.kube-controller-manager.daemonzcdk.master.auth-webhookc                    s6   |   ¡  |  d¡rd| _| j ddg¡ tƒ  ¡  d S )NÚmicrok8szmicrok8s kubectlz/root/cdk/kubelet/config.yamlz!/root/cdk/audit/audit-policy.yaml)r7   r]   r2   rU   r_   r¡   rg   r;   r£   r5   r6   rg   :  s   
þzUbuntuKubernetes.setup)r—   r˜   r™   r¥   r¦   r§   r0   r¨   r   rg   r©   r5   r5   r£   r6   rª   '  s
    
rª   )Úfnmatchr   r‚   r€   r-   Úsos.report.pluginsr   r   r   r   r   r¥   r¨   r§   r
   r    rª   r5   r5   r5   r6   Ú<module>   s    o