U
    -_g1                     @   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ddd	gZd
gZddddgZ	dddddddddddddddddd d!gZ
d"d#d$d%gZed&d'd(d)ed*d'd+d)ed,d'd-d)ed.d'd/d)ed0d1ed2d3gZd4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCS )D
Kubernetesz+Kubernetes container orchestration platformr	   )Z	containeri  z/etc/kubernetesz/run/flannelz/var/lib/kubelet/config.yamlz"/var/lib/kubelet/kubeadm-flags.envz /var/lib/kubelet/*_manager_statez/etc/kubernetes/pkiz /var/log/pods/kube-system_etcd-*z*/var/log/pods/kube-system_kube-apiserver-*z3/var/log/pods/kube-system_kube-controller-manager-*z*/var/log/pods/kube-system_kube-scheduler-*eventsZdeploymentsZ	ingressespodsZpvcservicesZ
daemonsetsZreplicasetsZ	endpointsZstatefulsetsZ
configmapsZserviceaccountsZsecretsZjobsZcronjobsZclusterrolesZclusterrolebindingsZlimitrangesZresourcequotasZscZpvZrolesZrolebindingsallFz'collect all namespace output separately)defaultdescdescribez(collect describe output of all resourceskubelogsz4copy some kube-system pod logs without using the APIpodlogsz2capture stdout/stderr logs from pods using the APIpodlogs-filter z1only collect logs from pods matching this pattern)r   Zval_typer   Zkubectlc                 C   sB   t jdrd S | jD ]&}| |r|  jd| 7  _ q>qd S )N
KUBECONFIGz --kubeconfig=)osenvirongetfilespath_existskube_cmd)selfZ_kconf r   ?/usr/lib/python3/dist-packages/sos/report/plugins/kubernetes.pyset_kubeconfigk   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)r   ).0fr   r   r   	<genexpr>u   s     z-Kubernetes.check_is_master.<locals>.<genexpr>)anyr   r$   r   r$   r   check_is_masters   s    zKubernetes.check_is_masterc                    s     j   j  dr.   j  ddddg   sLd S dD ]} j j	 d| dd	 qP 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r4 dr4|d  dd  D ]6}| }|sq|d } j j	 d| dd	 q j j	 dgdd	  j j	 ddd	  dr jddg  d       d S )Nr   r   ZKUBERNETES_HTTP_PROXYZKUBERNETES_HTTPS_PROXYZKUBERNETES_NO_PROXY)versionzconfig view cluster-infoZsubdirr   c                    s   g | ]} j  d | qS ) get -o json r   r"   resr$   r   r   
<listcomp>   s   z$Kubernetes.setup.<locals>.<listcomp>c                    s   g | ]} j  d | qS ) get r-   r.   r$   r   r   r0      s   z
 get nodesstatusr   r   output   z describe node z get -o json nodesz get --raw /metricszkubevirt-virtctlZvmsZvmiszvirtctl version)add_copy_specconfig_filesZadd_forbidden_pathforbidden_paths
get_optionkube_system_logsZadd_env_varr'   add_cmd_outputr   global_resourcescollect_cmd_output
splitlinessplitis_installed	resourcesextendcollect_per_resource_detailscollect_all_resources)r   subcmdZnodeslineZwordsZnoder   r$   r   setupw   sn    




zKubernetes.setupc              	   C   s`  | j | j ddd}|d  dd }dd |D }|D ]}d	| }| d
r| j d| }| jD ]"}| j| d| d| d ql| drF| j d| }| jD ]}|dkrq| | d| }|d dkrdd |d  dd D }	|	D ]@}
| j d| }| j| d| d|
 d| d| d qq| dr<| | q<dS )z7 Collect details about each resource in all namespaces z get namespacesr*   r+   r3   r4   Nc                 S   s(   g | ] }|rt | r| d  qS r   )lenr>   )r"   nr   r   r   r0      s       z;Kubernetes.collect_per_resource_details.<locals>.<listcomp>z--namespace=r   r,   r)   cluster-info/r   r   r1   r2   r   c                 S   s   g | ]}|  d  qS rG   )r>   )r"   kr   r   r   r0      s     z
 describe /r   )r<   r   r=   r8   r@   r:   exec_cmd_get_pod_logs)r   ZknsZ	kn_outputZknspsZnspaceZknspk_cmdr/   retZk_listitemr   r   r   rB      s@    





z'Kubernetes.collect_per_resource_detailsc              
   C   sV  | j  d| }| | d}|d dkrRt|d }| drTt| dnd }|d D ]}|r~t||d d	 s~q`d
|d d  d|d d	  }d|d kr|d d D ]>}|d d	 }	|d	 }
| j| j  d| d|	 d|
 |d qd|d kr`|d d D ]@}|d d	 }	|d	 }
| j| j  d| d|	 d|
 |d qq`d S )Nr,   z podsr2   r   r3   r   itemsZmetadatanamerJ   	namespacez	/podlogs/Z
containersspecr)   z logs z -c r+   ZinitContainers)	r   rM   jsonloadsr8   r   rematchr:   )r   rT   rO   rP   r   ZregZpodZ_subdirZcontZpod_nameZ	cont_namer   r   r   rN      s8     zKubernetes._get_pod_logsc                 C   s>   |  ds:| j d}| jD ]}| j| d| dd qdS )z% Collect details about all resources r   z get --all-namespaces=truer)   r*   r+   N)r8   r   r@   r:   )r   rO   r/   r   r   r   rC     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 *****)	Zdo_cmd_output_subr   Zdo_cmd_private_subjoinr6   do_file_private_sublistr   Zdo_path_regex_sub)r   Z
env_regexpZpathexpZregexpZsubstr   r   r   postproc  s    

zKubernetes.postprocN)__name__
__module____qualname__Z
short_descZplugin_nameZprofilesZplugin_timeoutr6   r7   r9   r@   r;   r   strZoption_listr   r    r'   rF   rB   rN   rC   r_   r   r   r   r   r
   &   s   E(!
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__r   r   rf   /  s    
zRedHatKubernetes.check_enabledc                    s   |    t   d S r!   )r    re   rF   r$   rg   r   r   rF   5  s    zRedHatKubernetes.setup)r`   ra   rb   KUBE_PACKAGESpackagesKUBECONFIGSr   	KUBE_SVCSr   rf   rF   __classcell__r   r   rg   r   rd   '  s
   rd   c                       sH   e Zd Zed Zed Zed Z fddZ	dd Z
 fdd	Z  ZS )
UbuntuKubernetes)k8s)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                    sP   |    | drd| _n| dr2d| _|   | jddg t   d S )NZmicrok8szmicrok8s kubectlro   zk8s kubectlz/root/cdk/kubelet/config.yamlz!/root/cdk/audit/audit-policy.yaml)r    r?   r   _canonical_kubernetesr6   rA   re   rF   r$   rg   r   r   rF   O  s    

zUbuntuKubernetes.setupc              
      sz   | j dd d d}ddg}| | d| d| d	| d
| d| d| dg |  fdd|D  d S )Nz
snap.k8s.*)Zunitsro   z/var/snap/k8s/commonr2   r   z/argsz/var/lib/k8s-dqlite/info.yamlz /var/lib/k8s-dqlite/cluster.yamlz'/var/lib/k8sd/state/truststore/k8s.yamlz&/var/lib/k8sd/state/database/info.yamlz)/var/lib/k8sd/state/database/cluster.yamlz/var/lib/k8sd/state/daemon.yamlc                    s   g | ]}  d | qS )r)   r   )r"   rD   Zk8s_cmdr   r   r0   s  s    z:UbuntuKubernetes._canonical_kubernetes.<locals>.<listcomp>)Zadd_journalr5   r:   )r   Z
k8s_commonZk8s_subcmdsr   rq   r   rp   ^  s$    
z&UbuntuKubernetes._canonical_kubernetesc                    s   t    | d d S )Nz;/var/snap/k8s/common/var/lib/k8sd/state/truststore/k8s.yaml)re   r_   r]   r$   rg   r   r   r_   w  s    
zUbuntuKubernetes.postproc)r`   ra   rb   ri   rj   rk   r   rl   r   rF   rp   r_   rm   r   r   rg   r   rn   :  s   
rn   )Zfnmatchr   rX   rV   r   Zsos.report.pluginsr   r   r   r   r   ri   rl   rk   r
   rd   rn   r   r   r   r   <module>   s     