
    #fQ%                         d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ  e j        e          Z ed	d
          Z G d dej                  ZdS )    N)
namedtuple)TupleListIterableUnion)	renderers
interfaces)requirements)plugins)linux)pslistMountInfoData)
mnt_id	parent_idst_devmnt_root_path	path_rootmnt_optsfieldsmnt_typedevnamesb_optsc                   `   e Zd ZdZdZdZedeej	        j
                 fd            Zededeeeeeeee         ee         eeee         f
         f         fd            Zdeej        j                 d	efd
Zdeej        j                 dee         ded	edeeeef                  f
dZd ZdS )	MountInfoz0Lists mount points on processes mount namespaces)   r   r   )   r   r   returnc                 T   t          j        ddg d          t          j        dt          j        d          t          j        dt          j        d	
          t          j        ddt          d          t          j        ddt          d          t          j
        dddd          gS )NkernelzLinux kernel)Intel32Intel64AArch64)namedescriptionarchitecturesr   )r   r   r   )r#   pluginversion
linuxutils)r   r   r   )r#   	componentr'   pidszFilter on specific process IDs.T)r#   r$   element_typeoptionalmntnszDFilter results by mount namespace. Otherwise, all of them are shown.mount-formatzShows a brief summary of the mount points information with similar output format to the older /proc/[pid]/mounts or the user-land command 'mount -l'.F)r#   r$   r,   default)r
   ModuleRequirementPluginRequirementr   PsListVersionRequirementr   LinuxUtilitiesListRequirementintBooleanRequirement)clss    _/home/panchajanya/Development/work/volatility3/volatility3/framework/plugins/linux/mountinfo.pyget_requirementszMountInfo.get_requirements*   s     **???  
 *fmY   +!U-A9   (= 	   (4    +#0   3!
 !	
    Nc                    |                                 }|sdS t          j                            ||          }|sdS |                                }|                                }|j        }|j        j        }|j         d|j	         }	g }
|

                    |                                           |
                    |                                           g }|                                r|
                    d|j                    |                                rc|j        j        }|
                    d|            |                    |j        j                  }|r||k    r|
                    d|            |                                r|
                    d           |                                }|                                }|sd}g }|
                    |                                           |                    |                                           t1          |||	|||
||||
  
        S )zuExtract various information about a mount point.
        It mimics the Linux kernel show_mountinfo function.
        N:zshared:zmaster:zpropagate_from:
unbindablenone)get_mnt_rootr   r4   get_path_mntpath
get_mnt_sbr   
mnt_parentmajorminorappendget_flags_accessextendget_flags_opts	is_sharedmnt_group_idis_slave
mnt_masterget_dominating_idfsrootis_unbindableget_typeget_devnamer   )r8   mnttaskmnt_rootr   r   
superblockr   r   r   r   r   masterdominating_idr   r   r   s                    r9   get_mountinfozMountInfo.get_mountinfoO   sB    ##%% 	4(55dC@@	 	4 ^^%%
j.	$99z'799 ,,..///**,,--- ==?? 	8MM6C$466777<<>> 	A^0FMM,F,,---11$',??M A&!8!8???@@@ 	(MM,'''&&((//## 	Gz2244555z0022333
 
 	
r;   tasksfiltered_by_pidsc              #     K   t                      }|D ]}|r&|j        r|j        j        r|j        r|j        j        s+|j        j        }	 |                                }n## t          $ r t          j                    }Y nw xY w|	                                D ]9}|s.t          |j                  }||v r|                    |           |||fV  :d S )N)setrP   rQ   nsproxymnt_ns	get_inodeAttributeErrorr   NotAvailableValueget_mount_pointsr6   r   add)	selfr\   r]   seen_mountpointsrV   mnt_namespace	mnt_ns_idmountr   s	            r9   _get_tasks_mountpointsz MountInfo._get_tasks_mountpoints   s.     
 55 	- 	-D	G	 GL	 L		
 L'	  L/M:)3355		! : : :%799			: '7799 - - ( 5 ..F!111 (,,V444E9,,,,,-%	- 	-s   A  B ?B 
mnt_ns_idsmount_formatc              #     K   d}|                      ||          D ]\  }}}|rt          |t          j                  rd}t          |t          j                  s|r||vrF|                     ||          }	|	_|rmt                      }
|
                    |	j                   |
                    |	j                   d	                    |
          }|	j
        |	j        |	j        |g}n}d	                    |	j                  }d	                    |	j                  }d	                    |	j                  }|	j        |	j        |	j        |	j        |	j        |||	j        |	j
        |g
}|g}|r|                    |j                   |                    |           d|fV  |rt*                              d           d S d S )NFT, r   zSCould not filter by mount namespace id. This field is not available in this kernel.)rl   
isinstancer   rd   r[   r_   updater   r   joinr   r   r   r   r   r   r   r   rG   pidrI   vollogwarning)rg   r\   rm   rn   r]   show_filter_warningrV   rU   rj   mnt_infoall_optsall_opts_strextra_fields_valuesmnt_opts_str
fields_strsb_opts_strfields_valuess                    r9   
_generatorzMountInfo._generator   s      $$($?$?#%
 %
 4	% 4	% D#y  +jI4OPP +&*# y)*EFF Z//))#t44H 55 1222 0111"xx11 $&% 	'##  #xx(9:: XXho66
!hhx'788 O&O*& %$'# 'KM /$$TX...  !4555m$$$$$ 	NNe    	 	r;   c                 8   | j                             d          }| j                             d          }| j                             d          }t          j                            |          }t          j                            | j        | j         d         |          }dt          fg}|r|                    dt          f           d}nd	}| j                             d          r#d
t          fdt          fdt          fdt          fg}nRdt          fdt          fdt          fdt          fdt          fdt          fdt          fdt          fdt          fdt          fg
}|
                    |           t          j        ||                     ||||                    S )Nr*   r-   r.   r   )filter_func	MNT_NS_IDPIDTFDEVNAMEPATHFSTYPEMNT_OPTSzMOUNT ID	PARENT_IDzMAJOR:MINORROOTMOUNT_POINTMOUNT_OPTIONSFIELDS	MOUNT_SRC
SB_OPTIONS)configgetr   r2   create_pid_filter
list_taskscontextr6   rG   strrI   r   TreeGridr   )	rg   r*   mount_ns_idsrn   
pid_filterr\   columnsr]   extra_columnss	            r9   runzMountInfo.run   s   {v&&{w//{~66]44T::
((L$+h/Z ) 
 
  %&  	%NNE3<(((#$;??>** 	C 3S!	MM S!c"$$ #&33c"s#M 	}%%%!OOE<?OPP
 
 	
r;   )__name__
__module____qualname____doc___required_framework_version_versionclassmethodr   r	   configurationRequirementInterfacer:   r   r   r6   r   r[   r   objectsObjectInterfaceboolrl   r   r    r;   r9   r   r   #   sd       ::"+H"
j&>&S!T "
 "
 "
 ["
H @
	eCc3T#YS	3TRUYVWW
@
 @
 @
 [@
D#-
*:;#- #- #- #- #-JA
*:;A IA 	A
 A 
%U
#	$A A A AF.
 .
 .
 .
 .
r;   r   )loggingcollectionsr   typingr   r   r   r   volatility3.frameworkr   r	   #volatility3.framework.configurationr
    volatility3.framework.interfacesr   volatility3.framework.symbolsr   volatility3.plugins.linuxr   	getLoggerr   rv   r   PluginInterfacer   r   r;   r9   <module>r      s  
  " " " " " " / / / / / / / / / / / / 7 7 7 7 7 7 7 7 < < < < < < 4 4 4 4 4 4 / / / / / / , , , , , , 
	8	$	$
 "E
 E
 E
 E
 E
' E
 E
 E
 E
 E
r;   