� <��g P� ���dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddlm&Z&ddlm'Z'ddlm(Z(ddlm)Z)ddlm*Z*ddlm+Z+gd�Z,e-e d ��r(e,�.d!�e/e��D����d"Z0ej1�2d#ej3���d$���Z4ej1�2d#ej3���d%���Z5e-ed&��Z6e-ed'��Z7ej8d(��Z9ej:��Z;da<e j=d)kZ>d*Z?ej@d+d,eAe jB��i��ZCeCjDZDGd-�d.ej@��ZEeF���GeEjH��ejIejJejKejLejMejNejOejOejPejQejRejSd/� ZTejUejVejWejXejYejZej[ej\ej]ej^ej_d0� Z`ed1gd2���Zaed3gd4���Zbed5gd6���Zced7d8��Zded9edjed:z��Zfed;gd<���Zged=d>d?�hegje��z��Zied@gdA���ZjedBgdC���ZkdD�ZldE�ZmdF�Zne$dG���Zo eodH��n7#ep$r/Zqe dIeq����edJdK��dLdLdL��arYdZq[qndZq[qwwxYwdM�ZsdN�ZtdO�ZudP�ZvdQ�ZwdR�ZxdS�ZydT�ZzdU�Z{ej1�2dV��sej1�2dW��rdX�Z|ndY�Z|ej}Z}GdZ�d[ep��Z~Gd\�d]��Ze��Z�drd_�Z�d`�Z�da�Z�ej�Z�dsdc�Z�Gdd�de��Z�dsdf�Z�dg�Z�dh�Z�di�Z�dj�Z�dk�Z�dl�Z�dm�Z�dn�Z�do�Z�Gdp�dq��Z�dS)tzLinux platform implementation.�N)� defaultdict)� namedtuple�)�_common)�_psposix)� _psutil_linux)� _psutil_posix)�ENCODING)�NIC_DUPLEX_FULL)�NIC_DUPLEX_HALF)�NIC_DUPLEX_UNKNOWN)� AccessDenied)� NoSuchProcess)� ZombieProcess)�bcat)�cat)�debug)�decode)�get_procfs_path)� isfile_strict)�memoize)�memoize_when_activated)� open_binary)� open_text)�parse_environ_block)�path_exists_strict)� supports_ipv6)� usage_percent)� PROCFS_PATH�IOPRIO_CLASS_NONE�IOPRIO_CLASS_RT�IOPRIO_CLASS_BE�IOPRIO_CLASS_IDLE�CONN_ESTABLISHED� CONN_SYN_SENT� CONN_SYN_RECV�CONN_FIN_WAIT1�CONN_FIN_WAIT2�CONN_TIME_WAIT� CONN_CLOSE�CONN_CLOSE_WAIT� CONN_LAST_ACK� CONN_LISTEN� CONN_CLOSING�prlimitc�d�g|]-}|�d���|����+|��.S)�RLIM)� startswith�isupper��.0�xs �_/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/psutil/_pslinux.py� <listcomp>r8As6��F�F�F�q����f�!5�!5�F�!�)�)�+�+�F��F�F�F�z/sys/class/power_supply�/proc/�/smaps� /smaps_rollup�proc_ioprio_get�proc_cpu_affinity_get� SC_CLK_TCK�littlei� AddressFamily�AF_LINKc��eZdZdZdZdZdZdS)� IOPriorityrr��N)�__name__� __module__� __qualname__r r!r"r#�r9r7rDrDks&���������O��O����r9rD) �R�S�D�T�t�Z�Xr6�K�W�I�P) �01�02�03�04�05�06�07�08�09�0A�0B�svmem) �total� available�percent�used�free�active�inactive�buffers�cached�shared�slab�sdiskio) � read_count� write_count� read_bytes� write_bytes� read_time� write_time�read_merged_count�write_merged_count� busy_time� popenfile)�path�fd�position�mode�flags�pmemz"rss vms shared text lib data dirty�pfullmem)�uss�pss�swap� pmmap_grouped) rx�rss�sizer�� shared_clean� shared_dirty� private_clean� private_dirty� referenced� anonymousr�� pmmap_extz addr perms � �pio)rnrorprq� read_chars� write_chars� pcputimes)�user�system� children_user�children_system�iowaitc���t|t��s J|���tj|��}|�d��d}|�d��rt |��s |dd�}|S)zWrapper around os.readlink().�r� (deleted)N�����)� isinstance�str�os�readlink�split�endswithr�rxs r7r�r��s�� �d�C� � �&�&�$�&�&� � �;�t� � �D� �:�:�f� � �a� �D� �}�}�\�"�"��+=�d�+C�+C���D�S�D�z�� �Kr9c�(�tjdtjdtjdi}||tjtjztjzz}|tjzr|�ddd��}|�dd��}|S)zZConvert file's open() flags into a readable string. Used by Process.open_files(). �r�wzw+�arzr+)r��O_RDONLY�O_WRONLY�O_RDWR�O_APPEND�replace)r|� modes_mapr{s r7�file_flags_to_moder��sw����c�2�;��R�Y��E�I� �U�b�k�B�K�7�"�)�C�D� E�D� �r�{��)��|�|�C��a�(�(�� �<�<��d� #� #�D� �Kr9c��|�dd��}d}|rd|��}nd|�d�}tj|tj��S)z�Return True if the given name refers to a root device (e.g. "sda", "nvme0n1") as opposed to a logical partition (e.g. "sda1", "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram") return True. �/�!Tz /sys/block/z/device)r�r��access�F_OK)�name�including_virtualrxs r7�is_storage_devicer��sX�� �<�<��S� !� !�D����+�#�T�#�#���*�T�*�*�*�� �9�T�2�7� #� #�#r9c��t|�d���5}|������dd�}ddd��n #1swxYwYgd�}t|��}|dkr|�d��|dkr|�d��|d kr|�d ��t d |��adS) z�Set a namedtuple of variable fields depending on the CPU times available on this Linux kernel version which may be: (user, nice, system, idle, iowait, irq, softirq, [steal, [guest, [guest_nice]]]) Used by cpu_times() function. �/statrN)r��nicer��idler��irq�softirq��steal� �guest� � guest_nice� scputimes)r�readliner��len�appendrr�)� procfs_path�f�values�fields�vlens r7�set_scputimes_ntupler��s �� � �*�*�*� +� +�*�q������#�#�%�%�a�b�b�)��*�*�*�*�*�*�*�*�*�*�*����*�*�*�*� K� K� K�F� �v�;�;�D� �q�y�y�� � �g���� �q�y�y�� � �g���� �r�z�z�� � �l�#�#�#��;��/�/�I�I�Is�/A�A�A�/proczignoring exception on import: r�zuser system idle�c���|d}||�dd��z} |d}|d}|d}n6#t$r)}t|jd�d���|cYd}~Sd}~wwxYw t t ���d ���}n#t $r|cYSwxYwd}|5|D]U} | ���} | �d ��r*|t| � ��d ��z }�V ddd��n #1swxYwY|tz}||z } ||z} | t| d z |��z} | | z } | |t|d z |��z z } t| ��S)ayFallback for kernels < 3.14 where /proc/meminfo does not provide "MemAvailable", see: https://blog.famzah.net/2014/09/24/. This code reimplements the algorithm outlined here: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 We use this function also when "MemAvailable" returns 0 (possibly a kernel bug, see: https://github.com/giampaolo/psutil/issues/1915). In that case this routine matches "free" CLI tool result ("available" column). XXX: on recent kernels this calculation may differ by ~1.5% compared to "MemAvailable:", as it's calculated slightly differently. It is still way more realistic than doing (free + cached) though. See: * https://gitlab.com/procps-ng/procps/issues/42 * https://github.com/famzah/linux-memavailable-procfs/issues/2 �MemFree:�Cached:rs Active(file):sInactive(file):� SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz /zoneinfoslowrrEg@) �get�KeyErrorr�argsrr�OSError�stripr2�intr��PAGESIZE�min) �memsrf�fallback�lru_active_file�lru_inactive_file�slab_reclaimable�errr�� watermark_low�line�avail� pagecaches r7�calculate_avail_vmemr�!s��< � � �D��d�h�h�z�1�-�-�-�H� ��/�0�� �!3�4��� 0�1���� ���� ��x��{� >� >� >� � � ������������ ���� � �?�,�,�7�7�7� 8� 8���� �������������M� �6�6�� 6� 6�D��:�:�<�<�D����v�&�&� 6���T�Z�Z�\�\�!�_�!5�!5�5� �� 6�6�6�6�6�6�6�6�6�6�6�6����6�6�6�6� �X��M� �=� �E��"3�3�I� ��Y��]�M�2�2�2�I� �Y��E� � ��$4�s�$:�M� J� J� J�J�E� �u�:�:�s@�<� A/�A*�$A/�*A/�3B� B!� B!�(AD�D�Dc ���g}i}tt���d���5}|D]7}|���}t|d��dz||d<�8 ddd��n #1swxYwY|d}|d} |d}n'#t$rd}|�d ��YnwxYw |d }||�d d��z }n'#t$rd}|�d ��YnwxYw |d } nA#t$r4 |d} n'#t$rd} |�d��YnwxYwYnwxYw |d} n'#t$rd} |�d��YnwxYw |d} nS#t$rF |d|dz|dz} n'#t$rd} |�d��YnwxYwYnwxYw |d} n#t$rd} YnwxYw||z |z |z } | dkr||z } |d}|dkrt|��}n#t$rt|��}YnwxYw|dkrd}|�d��n||kr|}t||z |d���}|rZd� d� |��t|��dkrdnd��}tj |td� ��t|||| || | ||| | � � S)!a7Report virtual memory stats. This implementation mimics procps-ng-3.3.12, aka "free" CLI tool: https://gitlab.com/procps-ng/procps/blob/ 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791 The returned values are supposed to match both "free" and "vmstat -s" CLI tools. �/meminfor�rNs MemTotal:r�sBuffers:rir�r�rjsShmem:s MemShared:rksActive:rgs Inactive:s Inact_dirty:s Inact_clean:sInact_laundry:rhsSlab:s MemAvailable:rc��round_z6{} memory stats couldn't be determined and {} set to 0z, �was�wererE�� stacklevel)rrr�r�r�r�r�r�r�format�joinr��warnings�warn�RuntimeWarningra)�missing_fieldsr�r�r�r�rbrfrirjrkrgrhrlrer�rd�msgs r7�virtual_memoryr�`sy���N� �D� ��)�)�3�3�3� 4� 4�4��� 4� 4�D��Z�Z�\�\�F�!�&��)�n�n�t�3�D����O�O� 4�4�4�4�4�4�4�4�4�4�4�4����4�4�4�4� �� �E� � � �D�)��{�#���� �)�)�)������i�(�(�(�(�(�)���� 0��j�!�� �$�(�(�+�Q�/�/�/���� �(�(�(������h�'�'�'�'�'�(����,��i����� �,�,�,� ,��-�(�F�F��� ,� ,� ,��F� � !� !�(� +� +� +� +� +� ,������,����(��j�!���� �(�(�(������h�'�'�'�'�'�(���� .�� �%���� � .� .� .� .��_�%���'�(��(�)�*� �H�� � .� .� .��H� � !� !�*� -� -� -� -� -� .������ .������H�~���� ������������ �4�<�&� �7� *�D� �a�x�x��t�|�� /��%�&�� �A�:�:� )��.�.�E��� �+�+�+�$�T�*�*����+���� �q�y�y������k�*�*�*�*� ���� ���U�U�]�U�1�=�=�=�G��9�F�M�M� �I�I�n� %� %���(�(�A�-�-�E�E�6� � �� � �c�>�a�8�8�8�8� � � �� � ������ � � � s��;A+�+A/�2A/�B�!B4�3B4�8C�!C>�=C>�D � E �D�E �!E�E �E�E �E � E�!E:�9E:�>F� G�F-�,G�-!G�G�G�G�G�G$�$ G3�2G3� H+�+I�Ic�>�i}tt���d���5}|D]7}|���}t|d��dz||d<�8 ddd��n #1swxYwY |d}|d}n5#t$r(t j��\}}}}}}}||z}||z}YnwxYw||z }t||d���} tt���d ���}|5dx} } |D]�}|�d ��r/t|�d ��d��d zdz} nC|�d ��r.t|�d ��d��d zdz} | �| �n(��d} | dz } tj | td���dx} } ddd��n #1swxYwYn=#t$r0} d| �d�} tj | td���dx} } Yd} ~ nd} ~ wwxYwtj|||| | | ��S)zReturn swap memory metrics.r�rr�rNs SwapTotal:s SwapFree:r�z/vmstatspswpin� �spswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0rEr�zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (�))rrr�r�r��cext� linux_sysinforr2r�r�r�r�r�sswap)r�r�r�r�rbrf�_�unit_multiplierrerd�sin�soutr�r�s r7� swap_memoryr��s�� �D� ��)�)�3�3�3� 4� 4�4��� 4� 4�D��Z�Z�\�\�F�!�&��)�n�n�t�3�D����O�O� 4�4�4�4�4�4�4�4�4�4�4�4����4�4�4�4� ��]�#���L�!���� � � � �37�3E�3G�3G�0��1�a��E�4�� �� �� ������ ���� �4�<�D��D�%��2�2�2�G�� �?�,�,�5�5�5� 6� 6��� � �� �C�$�� � ���?�?�9�-�-�?��d�j�j��.�.�q�1�2�2�Q�6��=�C�C��_�_�Z�0�0�?��t�z�z�$�/�/��2�3�3�a�7�$�>�D��?�t�'7��E�� E���8�8��� �c�>�a�@�@�@�@����d�% � � � � � � � � � � ���� � � � ��� ���� 7�03� 7� 7� 7� � � �c�>�a�8�8�8�8����d�d�d�d�d�d���������8 �=���d�G�S�$� ?� ?�?sN�;A)�)A-�0A-�5B�/B8�7B8�G �3B>F=�=G�G� H�&G>�>Hc�N�t��}t|��t|�d���5}|������}ddd��n #1swxYwY|dt t j��dz�}d�|D��}t |�S)z�Return a named tuple representing the following system-wide CPU times: (user, nice, system, idle, iowait, irq, softirq [steal, [guest, [guest_nice]]]) Last 3 fields may not be available on all Linux kernel versions. r�Nrc�<�g|]}t|��tz ��SrJ��float� CLOCK_TICKSr4s r7r8zcpu_times.<locals>.<listcomp>-s#�� 5� 5� 5��e�A�h�h��$� 5� 5� 5r9)rr�rr�r�r�r��_fields)r�r�r�r�s r7� cpu_timesr!s���"�#�#�K���%�%�%� � �*�*�*� +� +�&�q������#�#�%�%��&�&�&�&�&�&�&�&�&�&�&����&�&�&�&� �A��I�-�.�.��2�2� 3�F� 5� 5�f� 5� 5� 5�F� �f� �s�'A#�#A'�*A'c��t��}t|��g}t|�d���5}|���|D]y}|�d��rb|���}|dt tj��dz�}d�|D��}t|�}|� |���z|cddd��S#1swxYwYdS)zfReturn a list of namedtuple representing the CPU times for every CPU available on the system. r�scpurc�<�g|]}t|��tz ��SrJrr4s r7r8z!per_cpu_times.<locals>.<listcomp>?s#��A�A�A�Q�%��(�(�[�0�A�A�Ar9N) rr�rr�r2r�r�r�rr�)r��cpusr�r�r�r��entrys r7� per_cpu_timesr 1s)��"�#�#�K���%�%�%� �D� � �*�*�*� +� +� �q� � � � � � �� #� #�D����v�&�&� #���������C� �(9�$:�$:�Q�$>� >�?��A�A�&�A�A�A��!�6�*��� � �E�"�"�"��� � � � � � � � � � � � ���� � � � � � s�BC�C�Cc�N� tjd��S#t$�rd}tt ���d���5}|D].}|����d��r|dz }�/ ddd��n #1swxYwY|dkr�tjd��}tt ���d���5}|D]7}|� d ��d}|� |��r|dz }�8 ddd��n #1swxYwY|dkrYdS|cYSwxYw) z0Return the number of logical CPUs in the system.�SC_NPROCESSORS_ONLNr�/cpuinfos processorrNzcpu\dr�r�) r��sysconf� ValueErrorrr�lowerr2�re�compilerr��match)�numr�r��searchs r7�cpu_count_logicalrEs�����z�/�0�0�0�� ������ �O�-�-�7�7�7� 8� 8� �A�� � ���:�:�<�<�*�*�<�8�8���1�H�C�� � � � � � � � � � � � ���� � � � � �!�8�8��Z��)�)�F��o�/�/�6�6�6�7�7� !�1��!�!�D��:�:�c�?�?�1�-�D��|�|�D�)�)�!��q����!� !� !� !� !� !� !� !� !� !� !� !���� !� !� !� !� �!�8�8��4�4�� � � �-���s]��+D$�2B�4 D$�B �D$�B �;D$�;D �? D$� D �D$�D � D$�D$�#D$c�P�t��}d}d}tj|��ptj|��D]b}t|��5}|�|��������ddd��n #1swxYwY�ct |��}|dkr|Si}i}tt���d���5}|D]�}|������}|s& |d||d<n#t$rYnwxYwi}�P|� d��r+|� d d ��\} } t| ��|| <�� ddd��n #1swxYwYt|�����}|pdS) z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNrr� cpu cores� physical id)rrs :r)�set�globr�add�readr�r�rrr�r2r�r��sumr�) �ls�p1�p2rxr��result�mapping� current_infor��key�values r7�cpu_count_coresr(bs4�� ���B� E�B� J�B�� �"� � �.���2���%�%�� �� � � %�!� �F�F�1�6�6�8�8�>�>�#�#� $� $� $� %� %� %� %� %� %� %� %� %� %� %���� %� %� %� %�� ��W�W�F� ��{�{�� ��G��L� ��)�)�3�3�3� 4� 4�/��� /� /�D��:�:�<�<�%�%�'�'�D�� /��<H�$�=�G�L��8�9�9�� �����D�����!� � ����!?�@�@� /�!�Z�Z���2�2� ��U�$'��J�J� �S�!�� /�/�/�/�/�/�/�/�/�/�/�/����/�/�/�/�"����!�!� "� "�F� �>�T�sI� :B�B �B �-E8�D�E8� D$�!E8�#D$�$AE8�8E<�?E<c�2�tt���d���5}d}d}d}|D]�}|�d��r(t|���d��}ny|�d��r(t|���d��}n<|�d��r't|���d��}|�|�|�n��ddd��n #1swxYwYd}t j||||��S)z*Return various CPU stats as a named tuple.r�Nsctxtrsintrssoftirqr)rrr2r�r�r� scpustats)r�� ctx_switches� interrupts�soft_interruptsr��syscallss r7� cpu_statsr/�sW�� ��)�)�0�0�0� 1� 1��Q�� �� ���� � �D����w�'�'� 7�"�4�:�:�<�<��?�3�3� � �����)�)� 7� ������a��1�1� � �����,�,� 7�"%�d�j�j�l�l�1�o�"6�"6���(�#�/��*����!������������������"�H� � ��j�/�8� � �s�C C5�5C9�<C9c��tt���d���5}d�|D��cddd��S#1swxYwYdS)z7Return current CPU frequency from cpuinfo if available.rc��g|]R}|����d���)t|�dd��d����SS)scpu mhz�:r)rr2rr�)r5r�s r7r8z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>�s_�� � � ���z�z�|�|�&�&�z�2�2� � �$�*�*�T�1�%�%�a�(� )� )� � � r9N)rr)r�s r7�_cpu_get_cpuinfo_freqr3�s��� ��)�)�3�3�3� 4� 4� �� � �� � � � � � � � � � � � � � � ���� � � � � � s � 8�<�<z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc ��t��}tjd��ptjd��}|�d����g}tjj}t |��D�]O\}}t|��t|��kr ||dz}nt||d��d���}|�st||d ��d���}|�Vd |�d �}t|d���d kr*|� tj d d d ������d}t|���t|��dz }tt||d������dz } tt||d������dz } |� tj || | ������Q|S)z�Return frequency metrics for all CPUs. Contrarily to other OSes, Linux updates these values in real-time. z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc�j�ttjd|�������S)Nz[0-9]+)r�rr�group)r6s r7�<lambda>zcpu_freq.<locals>.<lambda>�s&���R�Y�y�!�%<�%<�%B�%B�%D�%D�!E�!E�r9)r&i��scaling_cur_freqN�r��cpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0 r�z!can't find current frequency file�scaling_max_freq�scaling_min_freq)r3r�sortr�rxr�� enumerater�rrr�r�scpufreq�NotImplementedErrorr�) � cpuinfo_freqs�paths�ret�pjoin�irx�curr� online_pathr��max_�min_s r7�cpu_freqrJ�s��� .�/�/� �� � :� � �D� �Y�B� C� C� � � � �E�E� �F�F�F����� �� ��'�'� ;� ;�G�A�t��5�z�z�S��/�/�/�/�%�Q�'�$�.����E�E�$�(:�;�;�d�K�K�K���|��E�E�$�(:�;�;�d�K�K�K���<�"J��"J�"J�"J�K��;��6�6�6�%�?�?�� � �7�#3�C��c�#B�#B�C�C�C� �=�C�-�c�2�2�2��t�9�9�t�#�D��t�E�E�$�(:�;�;�<�<�=�=��D�D��t�E�E�$�(:�;�;�<�<�=�=��D�D� �J�J�w�'��d�D�9�9� :� :� :� :�� r9c�2�d�t��D��S)z}Alternate implementation using /proc/cpuinfo. min and max frequencies are not available and are set to None. c�:�g|]}tj|dd����S)r�)rr?r4s r7r8zcpu_freq.<locals>.<listcomp>�s'��O�O�O�!�� ��C��-�-�O�O�Or9)r3rJr9r7rJrJ�s ��P�O�7L�7N�7N�O�O�O�Or9c��eZdZdS)�_Ipv6UnsupportedErrorN)rGrHrIrJr9r7rNrN�s�������Dr9rNc�r�eZdZdZd�Zd�Zd�Zed���Zed d���Z ed d���Z d d �Z dS) �NetConnectionsawA wrapper on top of /proc/net/* files, retrieving per-process and system-wide open connections (TCP, UDP, UNIX) similarly to "netstat -an". Note: in case of UNIX sockets we're only able to determine the local endpoint/path, not the one it's connected to. According to [1] it would be possible but not easily. [1] http://serverfault.com/a/417946 c �L�dtjtjf}dtjtjf}dtjtjf}dtjtjf}dtjdf}|||||f||f|f|f||f|f|f|f||||f||f||fd� |_d|_dS)N�tcp�tcp6�udp�udp6�unix) �allrR�tcp4rSrT�udp4rUrV�inet�inet4�inet6)�socket�AF_INET� SOCK_STREAM�AF_INET6� SOCK_DGRAM�AF_UNIX�tmap� _procfs_path)�selfrXrSrYrUrVs r7�__init__zNetConnections.__init__�s����v�~�v�'9�:������);�<���v�~�v�'8�9������):�;������-���$��d�D�1��$�<��G��G��$�<��G��G��G��4��t�,��D�\��D�\�  �  �� �!����r9c��tt��}tj|j�d|�d���D]�} t |j�d|�d|����}|�d��r<|dd�dd�}||�|t|��f���q#ttf$rY��t$rI}|j tj krYd}~��|j tjkrt|��Yd}~�Ђd}~wwxYw|S)Nr��/fd�/fd/zsocket:[r������)r�listr��listdirrdr�r2r�r��FileNotFoundError�ProcessLookupErrorr��errno�EINVAL� ENAMETOOLONGr)re�pid�inodesry�inoder�s r7�get_proc_inodeszNetConnections.get_proc_inodessA���T�"�"���*�� 1�<�<�C�<�<�<�=�=� 9� 9�B� 9� �D�$5�!E�!E��!E�!E��!E�!E�F�F�� �#�#�J�/�/�9�!�!�"�"�I�c�r�c�N�E��5�M�(�(�#�s�2�w�w��8�8�8���%&�'9�:� � � ���� � � ��9�� �,�,��H�H�H�H��9�� 2�2�2��#�J�J�J��H�H�H�H������ ����� s)�B%�%D �8 D �D�$D�D�D c��i}t��D]H} |�|�|�����,#ttt f$rY�EwxYw|S�N)�pids�updaterurmrn�PermissionError)rersrrs r7�get_all_inodeszNetConnections.get_all_inodes*ss�����6�6� � �C� �� � �d�2�2�3�7�7�8�8�8�8��%�'9�?�K� � � ��� ����� s�(=�A�Ac ��|�d��\}}t|d��}|sdS|�d��}|tjkr`t r1tj|tj|��ddd���}n�tj|tj|����}n�tj|��} t rCtjtj tj dgtj d|���R���}nBtjtj tj dgtj d|���R���}n%#t$rt��std��wxYwt!j||��S) a�Accept an "ip:port" address as displayed in /proc/net/* and convert it into a human readable form, like: "0500000A:0016" -> ("10.0.0.5", 22) "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) The IP address portion is a little or big endian four-byte hexadecimal number; that is, the least significant byte is listed first, so we need to reverse the order of the bytes to convert it to an IP address. The port is represented as a two-byte hexadecimal number. Reference: http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html �:�rJ�asciiNrjz>4Iz<4I)r�r��encoder]r^� LITTLE_ENDIAN� inet_ntop�base64� b16decoder`�struct�pack�unpackrrrNr�addr)r��family�ip�ports r7�decode_addresszNetConnections.decode_address:s}��"�:�:�c�?�?���D��4��}�}��� ��2� �Y�Y�w� � �� �V�^� #� #�� D��%�f�f�.>�r�.B�.B�4�4�R�4�.H�I�I����%�f�f�.>�r�.B�.B�C�C����!�"�%�%�B� � � ��)���� �E�E�F�M�%��,D�,D�E�E�E���B�B�  �)���� �E�E�F�M�%��,D�,D�E�E�E���B���� � � �$���:�/�T�9��  ���� �|�B��%�%�%s �B E�"E6Nc #�K�|�d��r!tj�|��sdSt |��5}|���t |d��D]�\}} |���dd�\ }} } } }}}}}} n)#t$rd|�d|�d|��} t| ��d�wxYw| |vr|| d\}}nd \}}|�||kr�{|tj krt| } n tj} t�| |��} t�| |��} n#t"$rY��wxYw|||| | | |fV��� ddd��dS#1swxYwYdS) z.Parse /proc/net/tcp* and /proc/net/udp* files.�6Nrr��error while parsing �; malformed line r�r�Nrj)r�r�rx�existsrr�r>r�r� RuntimeErrorr]r_� TCP_STATUSESr� CONN_NONErPr�rN)�filer��type_rs� filter_pidr��linenor�r��laddr�raddr�statusrtr�rrrys r7� process_inetzNetConnections.process_inetmsI���� �=�=�� � � �b�g�n�n�T�&:�&:� � �F� �t�_�_�# I�� �J�J�L�L�L� )�!�Q���! I�! I� ��� 6�� � � � �S�b�S�)�B�A�u�e�V�Q��1�a��E�E��"�6�6�6�.�t�.�.�"�.�.�%)�.�.��'�s�+�+��5� 6���� �F�?�?�%�U�m�A�.�G�C���&�G�C���)�j�C�.?�.?���� 2�2�2�!-�f�!5���!(�!2��!� .� =� =�e�V� L� L�� .� =� =�e�V� L� L����0�!�!�!� ��!�����v�u�e�U�F�C�H�H�H�H�H�C! I�# I�# I�# I�# I�# I�# I�# I�# I�# I�# I�# I�# I����# I�# I�# I�# I�# I�# IsO�*E4�3'B�E4�&C�AE4�6E � E4� E�E4�E�E4�4E8�;E8c #�$K�t|��5}|���|D]�}|���} |dd�\}}}}}}} n+#t$rd|vrY�:d|�d|��} t | ���wxYw| |vr || } ndg} | D]e\} } |�|| kr�t |��dkr|d nd }t jt|����}d }t j }| |||||| fV��f�� ddd��dS#1swxYwYdS) zParse /proc/net/unix files.r�r�r�r�r�Nr�rj�) rr�r�rr�r�r�socktype_to_enumr�r�)r�r�rsr�r�r��tokensr�r�rtr��pairsrrryrxr�r�s r7� process_unixzNetConnections.process_unix�s������t�_�_� L�� �J�J�L�L�L�� L� L�������� ,�28��1��+�/�A�q�!�Q��q�%�%��!�,�,�,��$��� ��N�t�N�N�d�N�N��'�s�+�+�+�,�����F�?�?�#�5�M�E�E�'�L�E�$� L� L�G�C��!�-�*��2C�2C� �-0��[�[�A�-=�-=�v�b�z�z�2�� '� 8��U��� D� D��!#��!(�!2��!�6�5�$��v�s�K�K�K�K�K� L�% L� L� L� L� L� L� L� L� L� L� L� L� L���� L� L� L� L� L� Ls6�-D�A�D�A;�!D�#A;�;A<D�D � D c �N�t��|_|�|�|��}|sgSn|���}t ��}|j|D]�\}}}|j�d|��}|t jt jhvr|� |||||���} n|� ||||���} | D]U\} }}} } } }|rtj | ||| | | ��}ntj | ||| | | |��}|�|���V��t|��S)Nz/net/)r�)rrdrur{rrcr]r^r`r�r�r�pconn�sconnrrk)re�kindrrrsrC� proto_namer�r�rxr ryr�r�r�� bound_pid�conns r7�retrievezNetConnections.retrieve�so��+�-�-��� �?��)�)�#�.�.�F�� �� � ��(�(�*�*�F��e�e��)-��4�� � � %�J����'�:�:�j�:�:�D��&�.�&�/�:�:�:��&�&��&�%��C�'������&�&�t�V�V��&�L�L��FH� � �B��F�E�5�%�����"�=��F�E�5�%����D�D�#�=��F�E�5�%�����D����� � � � � ��C�y�y�r9rw) rGrHrI�__doc__rfrur{� staticmethodr�r�r�r�rJr9r7rPrP�s������� � �!�!�!�.���4��� �0&�0&��\�0&�d�(I�(I�(I��\�(I�T�!L�!L�!L��\�!L�F�����r9rPrZc�6�t�|��S)z$Return system-wide open connections.)�_net_connectionsr�)r�s r7�net_connectionsr��s�� � $� $�T� *� *�*r9c��tt���d���5}|���}ddd��n #1swxYwYi}|dd�D]�}|�d��}|dksJt |�����|d|����}||dzd�������}tt|��\}}} } } } } }}}}}}}}}||||| || |f||<��|S)zsReturn network I/O statistics for every network interface installed on the system as a dict of raw tuples. z/net/devNrEr}rr) rr� readlines�rfind�reprr�r��mapr�)r��lines�retdictr��colonr�r�� bytes_recv� packets_recv�errin�dropin�_fifoin�_framein� _compressedin� _multicastin� bytes_sent� packets_sent�errout�dropout�_fifoout�_collisionsout� _carrierout�_compressedouts r7�net_io_countersr��sy�� �o�'�'�1�1�1� 2� 2��a�� � � � ���������������������G��a�b�b� �$ �$ ��� � �3�����q�y�y�y�$�t�*�*�y�y�y��F�U�F�|�!�!�#�#���e�a�i�k�k�"�(�(�*�*�0�0�2�2��* ��V� � �' � � � � � � � � � � � � � � � � � � � � � � � � �  ��� � � �Ns�A�A�Ac�*�tjttjttjt i}t�����}i}|D]�} tj |��}tj |��}tj |��\}}d� |��}d|v} tj| |||||��||<�}#t $r/} | jt"jkr�t'| ��Yd} ~ ��d} ~ wwxYw|S)z)Get NIC stats (isup, duplex, speed, mtu).�,�runningN)r�� DUPLEX_FULLr � DUPLEX_HALFr �DUPLEX_UNKNOWNr r��keys� cext_posix� net_if_mtu� net_if_flags�net_if_duplex_speedr�r� snicstatsr�ro�ENODEVr) � duplex_map�namesrCr��mtur|�duplex�speed� output_flags�isupr�s r7� net_if_statsr�s�� ��/� ��/� ��/��J� � � � "� "� $� $�E� �C����� ��'��-�-�C��+�D�1�1�E� �4�T�:�:�M�F�E��8�8�E�?�?�L���%�D��)��j��(�%��l���C��I�I��� � � ��y�E�L�(�(�� �#�J�J�J�J�J�J�J�J�����  ���� �Js�?C� D�!%D � DFc ��d�}d�}tj�t���d���r |��}nJtj�d��r |��}n t���d�}t |���i}|D]C}|\ }}} } } } } }}}|st |��s�!| t z} | t z} || | | | | |||f ||<�D|S)zcReturn disk I/O statistics for every disk installed on the system as a dict of raw tuples. c 3��K�tt���d���5}|���}ddd��n #1swxYwY|D�] }|���}t |��}|dkrF|d}t |d��}t t |dd���\ }}} } } } } }}}n�|dks|dkr2|d}t t |dd���\ }}}} } } } } }}}nO|dkr5|d}t t |dd���\}}} } d x} x} x}x} }nd |��}t|���||| || | | || |f V���dS) N� /diskstats�rFrEr���r�rznot sure how to interpret line )rrr�r�r�r�r�r)r�r�r�r��flenr��reads� reads_merged�rbytes�rtime�writes� writes_merged�wbytes�wtimer�rvr�s r7� read_procfsz%disk_io_counters.<locals>.read_procfs;s�����"�/�+�+�7�7�7� 8� 8� "�A��K�K�M�M�E� "� "� "� "� "� "� "� "� "� "� "���� "� "� "� "�� ;� ;�D��Z�Z�\�\�F��v�;�;�D��r�z�z��a�y���F�1�I����69�#�v�a��d�|�6L�6L�4��v�u�f�m��E�1�i�������t�r�z�z��a�y��69�#�v�a��d�|�6L�6L�4�� �f�e�V�]��E�1�i��������a�y��03�C������0D�0D�-��v�v�v�KL�L��L��L� �L�}�y�y�@��@�@�� ��o�o�%�������u��� �;� ;� ;� ;� ;�/ ;� ;s�A�A� Ac 3�\K�tjd��D�]}tjtj�d|����D]�\}}}d|vr� t tj�|d����5}|���������}ddd��n #1swxYwYtj� |��}tt|dd���\ }}} } } } } }}}||| | | | ||| |f V��ސ�dS)N� /sys/block�statr�) r�rl�walkrxr�rrr�r��basenamer�r�)�block�rootr��filesr�r�r�r�r�r�r�r�r�r�r�rvs r7� read_sysfsz$disk_io_counters.<locals>.read_sysfsis�����Z� �-�-� F� F�E�"$�'�"�'�,�,�|�U�*K�*K�"L�"L� F� F���a����&�&���r�w�|�|�D�&�9�9�:�:�6�a��V�V�X�X�^�^�-�-�3�3�5�5�F�6�6�6�6�6�6�6�6�6�6�6����6�6�6�6��w�'�'��-�-��47�s�F�3�B�3�K�3H�3H�1�� �f�e�V�]��E�1�i��U�F�F�F�E��l�M�9�F�F�F�F�F� F� F� Fs�9C � C �C r�r�z6/diskstats nor /sys/block are available on this system)r�rxr�rr@r��DISK_SECTOR_SIZE)�perdiskr�r��genr�r�r r�r�r�r�r�r�r�r�r�rvs r7�disk_io_countersr�6s;�� +;�+;�+;�\ F� F� F� �w�~�~��*�*�6�6�6�7�7� '��k�m�m��� ���� � %� %�'��j�l�l���� � � � � � �"�#�&�&�&��G��A�A��).� &��u�f�f�f�e�U�L� �9�� �0��6�6� � ��"�"���"�"�������u�%�}�i�A��� � � �Nr9c�8�eZdZdZddgZd�Zd�Zd�Zd�Zd�Z d S) �RootFsDeviceFinderaFdisk_partitions() may return partitions with device == "/dev/root" or "rootfs". This container class uses different strategies to try to obtain the real device path. Resources: https://bootlin.com/blog/find-root-device/ https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/. �major�minorc��tjd��j}tj|��|_tj|��|_dS)Nr�)r�r��st_devr�r)re�devs r7rfzRootFsDeviceFinder.__init__�s4���g�c�l�l�!���X�c�]�]�� ��X�c�]�]�� � � r9c�.�tt���d���5}|���dd�D]�}|���}t |��dkr�*|d���rt |d��nd}|d���rt |d��nd}|d}||jkr ||jkr|rd|��ccddd��S�� ddd��dS#1swxYwYdS)Nz /partitionsrEr�rrrF�/dev/) rrr�r�r��isdigitr�r�r)rer�r�r�r�rr�s r7�ask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions�sv�� �/�+�+�8�8�8� 9� 9� .�Q�� � � � �a�b�b�)� .� .���������v�;�;��?�?��*0��)�*;�*;�*=�*=�G��F�1�I����4��*0��)�*;�*;�*=�*=�G��F�1�I����4���a�y���D�J�&�&�5�D�J�+>�+>��.�-�t�~�~�-�-� .� .� .� .� .� .� .� .�� .� .� .� .� .� .� .� .� .� .� .� .� .���� .� .� .� .� .� .s�CD �;D � D�Dc�6�d|j�d|j�d�}t|��5}|D]Y}|�d��rB|����d��d}|rd|��ccddd��S�Z ddd��dS#1swxYwYdS)Nz/sys/dev/block/r}z/ueventzDEVNAME=rEr)r�rrr2r�� rpartition)rerxr�r�r�s r7�ask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block�s��A���A�A�d�j�A�A�A�� �t�_�_� .��� .� .���?�?�:�.�.�.��:�:�<�<�2�2�:�>�>�q�A�D��.�-�t�~�~�-�-�  .� .� .� .� .� .� .� .�� .� .� .� .� .� .� .� .� .� .� .� .� .���� .� .� .� .� .� .s�AB�?B�B�Bc���|j�d|j��}tjd��}|D]�} t |��}|5|������}||krOtj� tj� |����}d|��cddd��cS ddd��n #1swxYwY��#t$rY��wxYwdS)Nr}z/sys/class/block/*/devr) r�rr�iglobrrr�r�rxr��dirnamerm)re�needler�r�r��datar�s r7�ask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block�sS���J�-�-���-�-��� �3�4�4��� .� .�D� .��d�O�O���.�.��6�6�8�8�>�>�+�+�D��v�~�~�!�w�/�/������0E�0E�F�F��-�t�~�~� .�.�.�.�.�.�.�.�.�.�%�.�.�.�.�.�.�.�.�.�.�.����.�.�.�.���%� � � ��� ���� .� .s#�C�A-C�C � C � C�Cc���d}|�< |���}n&#t$r}t|��Yd}~nd}~wwxYw|�< |���}n&#t$r}t|��Yd}~nd}~wwxYw|�< |���}n&#t$r}t|��Yd}~nd}~wwxYw|�!t j�|��r|SdSdSrw)rr�rr rr�rxr�)rerxr�s r7�findzRootFsDeviceFinder.find�s(���� �<� ��/�/�1�1����� � � ��c� � � � � � � � ����� ���� �<� ��-�-�/�/����� � � ��c� � � � � � � � ����� ���� �<� ��/�/�1�1����� � � ��c� � � � � � � � ����� ���� � �����t� 4� 4� ��K� � � � s@�� >�9�>�A� A<�#A7�7A<�B� B:�!B5�5B:N) rGrHrIr�� __slots__rfrr rrrJr9r7r�r��su���������'�"�I�#�#�#� .� .� .�.�.�.� .� .� .�����r9r�c��t��}t��}|s�t|�d���5}|D]�}|���}|�d��s(|�|������S|�d��d}|dkr|�d���� ddd��n #1swxYwY|dkr?tj� d��r tj� d��}n"tj� |�d ���}g}tj |��}|D]l} | \} } }} | d krd } | d vr"t�����p| } |s| r||vr�@tj| | || ��} |�| ���m|S) z8Return mounted disk partitions as a list of namedtuples.z /filesystems�nodev� r�zfsNr�z /etc/mtabz /self/mounts�noner�>� /dev/root�rootfs)rrrr�r2rr�r�rx�isfile�realpathr��disk_partitionsr�rr� sdiskpartr�)rW�fstypesr�r�r��fstype� mounts_path�retlist� partitions� partition�device� mountpoint�opts�ntuples r7rr�s���e�e�G�!�#�#�K� � +� �+�3�3�3� 4� 4� +��� +� +���z�z�|�|�����w�/�/�+��K�K�� � � � �-�-�-�-�"�Z�Z��-�-�a�0�F������ � �E�*�*�*�� +� +� +� +� +� +� +� +� +� +� +� +���� +� +� +� +��g���"�'�.�.��"=�"=���g�&�&�{�3�3� � ��g�&�&�+�'C�'C�'C�D�D� ��G��%�k�2�2�J�� � � �+4�(�� �F�D� �V� � ��F� �,� ,� ,�'�)�)�.�.�0�0�:�F�F�� �� �V�7�2�2���"�6�:�v�t�D�D�����v����� �Ns�B C � C�Cc ���tjt��}tjd��}|�tjd����t d�|D����}tjd��}t jd��}|D]1}|�d|��}||vr|� |���2|D�][} |dz}tt|����dz }tj �tj �|��d ��}t!|�����} n#t$t&f$rY��wxYwt|d zd � ��} t|d zd � ��} t!|dzd� �����} | �& t| ��dz } n#t&$rd } YnwxYw| �& t| ��dz } n#t&$rd } YnwxYw|| � | || | f����]|�s;tjd��}t t)|����}|D�]} tj �|d��}tt|����dz }tj �|d��}t!|�����} n-#t$t&f$r} t+| ��Yd } ~ ��d } ~ wwxYwtj|dz��}d�|D��}d } d } |D�] }tj �||dz��}t!|d� �����}|dkr3ttj �||dz��d � ��} n8|dkr2ttj �||dz��d � ��} | �& t| ��dz } n#t&$rd } YnwxYw| �' t| ��dz } ��#t&$rd } Y��wxYw�� || � d|| | f���� t-|��S)a�Return hardware (CPU and others) temperatures as a dict including hardware name, label, current, max and critical temperatures. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - /sys/class/thermal/thermal_zone* is another one but it's more difficult to parse z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*c�D�h|]}|�d��d��S�r�r�r�r4s r7� <setcomp>z'sensors_temperatures.<locals>.<setcomp>)�&��;�;�;�A����� � �Q��;�;�;r9z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/�_inputg@�@r��_maxNr9�_crit�_labelr�z /sys/class/thermal/thermal_zone*�temp�typez /trip_point*c��h|]O}d�tj�|���d��dd�����PS)r�rrF)r�r�rxr�r�)r5�ps r7r-z'sensors_temperatures.<locals>.<setcomp>js[�����������)�)�!�,�,�2�2�3�7�7��!��<�=�=���r9�_type�critical�_temp�high)� collectionsrrkr�extend�sortedrr�subr�rrr�rxr�r rr�r�rrr�dict)rC� basenames� basenames2�replr��altname�baserx�current� unit_namer:r8�labelr�� trip_paths� trip_points� trip_point� trip_types r7�sensors_temperaturesrLs��� � !�$� '� '�C�� �;�<�<�I����T�Y�G�H�H�I�I�I��;�;��;�;�;�<�<�I� ��?���J� �:�@� A� A�D��#�#���(�(�.��5�5�� �)� #� #� � � �T� "� "� "��� @� @�� ��(�?�D��D��J�J�'�'�&�0�G��7�<�<������ 5� 5�v�>�>�D��D� � ���)�)�I�I����$� � � � �H� �����D�6�M�D�1�1�1����w���6�6�6���D�8�O�b�1�1�1�7�7�9�9�� � � ��T�{�{�V�+����� � � ����� ���� � � � ��?�?�V�3����� � � ����� ���� �I����u�g�t�X�>�?�?�?�?� �,A��I�@�A�A� ��3�y�>�>�*�*� ��( A�( A�D� ��w�|�|�D�&�1�1����T� � �+�+�f�4���w�|�|�D�&�1�1����I�I�O�O�-�-� � ���Z�(� � � ��c� � � ���������� ������4�.�#8�9�9�J���#����K��H��D�)� (� (� ��w�|�|�D�*�w�*>�?�?����r�2�2�2�8�8�:�:� �� �*�*�#��� � �T�:��+?�@�@�4� � � �H�H��&�(�(���� � �T�:��+?�@�@�4����D��#�$�$�T�{�{�V�3����%�$�$�$�#����$�����'�(�#(��?�?�V�#;����%�(�(�(�#'����(����(� � �N� !� !�2�w��h�"?� @� @� @� @� ��9�9�st�BE�E'�&E'�;G� G�G�#G6�6 H�H�"BK#�#L �4L�L �6P � P�P�P1�1 Q�Qc���tjt��}tjd��}|stjd��}t d�|D����}|D]�} t t |dz����}n&#t$r}t|��Yd}~�Ad}~wwxYwttj � tj � |��d�������}t|dzd� �����}||�t!j||������t%|��S) a�Return hardware fans info (for CPU and other peripherals) as a dict including hardware label and current speed. Implementation notes: - /sys/class/hwmon looks like the most recent interface to retrieve this info, and this implementation relies on it only (old distros will probably use something else) - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*c�D�h|]}|�d��d��Sr+r,r4s r7r-zsensors_fans.<locals>.<setcomp>�r.r9r/Nr�r2r�r9)r;rrkrr=r�rr�rrr�rxr�r r�r�r�sfanr?)rCr@rDrEr�rFrGs r7� sensors_fansrP�sM�� � !�$� '� '�C�� �:�;�;�I� �G��I�E�F�F� ��;�;��;�;�;�<�<�I��<�<�� ��$�t�h��/�/�0�0�G�G��� � � � �#�J�J�J� �H�H�H�H����� ������� � �R�W�_�_�T�%:�%:�F�C�C�D�D�J�J�L�L� ��D�8�O�b�1�1�1�7�7�9�9�� �I����g�l�5�'�:�:�;�;�;�;� ��9�9�s�"B� B%� B � B%c�\� �t��� � fd�}d�tjt��D��}|sdStj�tt |����}||dz|dz��}||dz|dz��}||dz|d z��}||d z��}|�|� d |z|z }n;#t$rd }Yn-wxYwtt|d zd�����}|dkrdSd}|tj�td��tj�td����} | �| dk}nGt|dzd���� ��� ��} | dkrd}n| dvrd}|r tj } nj|�5|�3 t||z dz��} nO#t$rtj} Yn7wxYw|�%t|dz��} | dkr tj} n tj} tj|| |��S)aReturn battery information. Implementation note: it appears /sys/class/power_supply/BAT0/ directory structure may vary and provide files with the same meaning but under different names, see: https://github.com/giampaolo/psutil/issues/966. c���|D]Q}t|����}|�kr8 t|��cS#t$r|���cYcSwxYw�RdS)zvAttempt to read the content of multiple files which may not exist. If none of them exist return None. r9N)rr�rr�)rBrxrC�nulls �r7� multi_bcatz#sensors_battery.<locals>.multi_bcat�s����� '� '�D��t�d�+�+�+�C��d�{�{�'��s�8�8�O�O�O��!�'�'�'��9�9�;�;�&�&�&�&�&�'����� �ts�/�A�Ac�h�g|]/}|�d��sd|���v�-|��0S)�BAT�battery)r2rr4s r7r8z#sensors_battery.<locals>.<listcomp>�sK�� � � � � �<�<�� � � �#,�q�w�w�y�y�"8�"8� �"8�"8�"8r9Nz /energy_nowz /charge_nowz /power_nowz /current_nowz /energy_fullz /charge_fullz/time_to_empty_nowgY@r�z /capacityrjr9z AC0/onlinez AC/onliner�/statusr�� dischargingF>�full�chargingTi�<r)�objectr�rl�POWER_SUPPLY_PATHrxr�r��ZeroDivisionErrorr�rr�rr�POWER_TIME_UNLIMITED�POWER_TIME_UNKNOWN�sbattery) rT�batsr�� energy_now� power_now� energy_full� time_to_emptyrd� power_plugged�onliner��secsleftrSs @r7�sensors_batteryrk�s���� �8�8�D� � � � � � � ���-�.�.� � � �D� ���t� �7�<�<�)�3�t�9�9� 5� 5�D���D�=�0�$��2F�G�G�J�� �4�,�.��~�0E�F�F�I��*�T�N�2�D�>�4I�J�J�K��J�t�&:�:�;�;�M���:�#9� ��j�(�;�6�G�G�� � � � ��G�G�G� �����c�$��,�r�:�:�:�;�;�� �b�=�=��4� �M� �Z� �� � �&� �5�5� �� � �&� �4�4���F����!� � � ��T�I�%��3�3�3�9�9�;�;�A�A�C�C�� �]� "� "�!�M�M� �+� +� +� �M� � .��/��� � �I�$9� 2��:� �1�D�8�9�9�H�H�� � 2� 2� 2��1�H�H�H� 2���� � "��}�r�)�*�*�� �a�<�<��1�H���-�� � �G�X�}� =� =�=s$�7C� C�C�3G � G"�!G"c��g}tj��}|D]9}|\}}}}}tj||pd|||��}|�|���:|S)z:Return currently connected users as a list of namedtuples.N)r��usersr�suserr�) r"�rawlist�itemr��tty�hostname�tstamprr�nts r7rmrm sf���G��j�l�l�G�����+/�(��c�8�V�S� �]�4����h��� D� D�����r����� �Nr9c�P�t���d�}t|��5}|D]b}|�d��rKt|������d��}|a|ccddd��S�cd|��}t|���#1swxYwYdS)zAReturn the system boot time expressed in seconds since the epoch.r�sbtimerNzline 'btime' not found in )rrr2rr�r�� BOOT_TIMEr�)rxr�r�rCr�s r7� boot_timerws������ &� &� &�D� �T� � � �a�� � �D����x�(�(� ��D�J�J�L�L�.�.�0�0��3�4�4��� �� � �  � � � � � � � � �2�4�1�1���3���� � � � ���� � � � � � s�AB�B�B�"Bc��t���t��}d�tj|��D��S)z7Returns a list of PIDs currently running on the system.c�T�g|]%}|����t|����&SrJ)rr�r4s r7r8zpids.<locals>.<listcomp>+s+�� <� <� <�q�� � � � � <�C��F�F� <� <� <r9)rr�r r�rlr�s r7rxrx(s9�� � � � #� #�H� -� -�D� <� <�B�J�t�,�,� <� <� <�<r9c��tj|��sdS t���d|�d�}t|��5}|D]R}|�d��r;t |���d��}||kccddd��S�Sd|��}t|���#1swxYwYdS#ttf$r|t��vcYSwxYw)zcCheck for the existence of a unix PID. Linux TIDs are not supported (always return False). Fr�rXsTgid:rNz'Tgid' line not found in ) r� pid_existsrrr2r�r�rr�rx)rrrxr�r��tgidr�s r7r{r{.sO�� � �s� #� #�!��u� !�&�'�'�6�6�#�6�6�6�D��T�"�"� &�a��+�+�D����x�0�0�+�"�4�:�:�<�<��?�3�3�� $�s�{�*�*�  &� &� &� &� &� &� &� &�+� 9�$�8�8�� ��o�o�%� &� &� &� &���� &� &� &� &� &� &����$� !� !� !��$�&�&�=� � � � !���s;�#B2�AB%� B2�B%�%B)�)B2�,B)�-B2�2!C�Cc��i}t��}t��D]�} t|�d|�d���5}|���}ddd��n #1swxYwY|�d��}||dzd����}t |d��}|||<��#ttf$rY��wxYw|S)zsObtain a {pid: ppid, ...} dict for all running processes in one shot. Used to speed up Process.children(). r�r�N�)rEr) rrxrrr�r�r�rmrn)rCr�rrr�r�rpar�dset�ppids r7�ppid_mapr�Os&�� �C�!�#�#�K��v�v� � �� �� �8�8�c�8�8�8�9�9� �Q��v�v�x�x�� � � � � � � � � � � ���� � � � ��:�:�d�#�#�D���q�� � �#�)�)�+�+�D��t�A�w�<�<�D��C��H�H��"�#5�6� � � � �D� ���� �Js4�B2�A� B2�A �B2�A � B2�2C�Cc�F��tj����fd���}|S)zlDecorator which translates bare OSError and OSError exceptions into NoSuchProcess and AccessDenied. c���|j|j}} �|g|�Ri|��S#t$r}t||��|�d}~wt$r*}|���t ||��|�d}~wt$rU}|���tj � |j �d|�d���st ||��|��d}~wwxYw)Nr�r�) rr�_namerzrrn�_raise_if_zombierrmr�rxr�rd)rer��kwargsrrr�r��funs �r7�wrapperz wrap_exceptions.<locals>.wrapperjs ����H�d�j�T�� ��3�t�-�d�-�-�-�f�-�-� -��� 3� 3� 3��s�D�)�)�s� 2�����!� 4� 4� 4� � !� !� #� #� #���T�*�*�� 3����� � � � � � !� !� #� #� #��7�>�>�T�%6�"C�"C��"C�"C�"C�D�D� 8�#�C��.�.�C�7� ����� ���s+� � C �8� C �%A*�* C �7AC�C )� functools�wraps)r�r�s` r7�wrap_exceptionsr�es:��� �_�S����������$ �Nr9c��eZdZdZgd�Zd�Zd�Zd�Zd�Ze e d�����Z e e d�����Z e e d �����Z d �Zd �Ze d ���Ze d ���Ze d���Ze d���Ze d���Zej�dej���d���r e d���Ze d���Ze d���Ze d;d���Ze d���Ze d���Zese rHd�Z!e e"j#d��e"j#d��e"j#d��fd���Z$e d���Z%neZ%e r e d ���Z&e d!���Z'e e"j#d"��fd#���Z(e e"j#d$��fd%���Z)e d&���Z*e d'���Z+e d(���Z,e-r)e d)���Z.e"j#d*��fd+�Z/e d,���Z0e1re d-���Z2e d.���Z3e4e5d/��r e d;d0���Z6e d1���Z7e d2���Z8e d<d4���Z9e d5���Z:e d6���Z;e e"j#d7��fd8���Z<e e"j#d9��fd:���Z=dS)=�ProcesszLinux process implementation.)�_cacher��_ppidrdrrc�V�||_d|_d|_t��|_dSrw)rrr�r�rrd)rerrs r7rfzProcess.__init__�s+������� ��� �+�-�-����r9c�� t|j�d|j�d���}|�d��}||dz|dz�}|dkS#t$rYdSwxYw)Nr�r�r~rErF�ZF)rrdrrr�r�)rerrr�s r7� _is_zombiezProcess._is_zombie�s��� "��4�,�>�>�t�x�>�>�>�?�?�D��:�:�d�#�#�D��$��(�T�A�X�-�.�F��T�>� !�� � � � ��5�5� ���s�A � A�Ac�n�|���r t|j|j|j���dSrw)r�rrrr�r��res r7r�zProcess._raise_if_zombie�s9�� �?�?� � � B����$�*�d�j�A�A� A� B� Br9c�L�tj|j�d|j����dS)z+Raise NSP if the process disappeared on us.r�N)r�r�rdrrr�s r7�_raise_if_not_alivezProcess._raise_if_not_alive�s-�� ��4�$�1�1�t�x�1�1�2�2�2�2�2r9c�"�t|j�d|j�d���}|�d��}||�d��dz|�}||dzd����}i}||d<|d |d <|d|d <|d |d <|d|d<|d|d<|d|d<|d|d<|d|d<|d|d< |d|d<n$#t $rtd��d |d<YnwxYw|S)aYParse /proc/{pid}/stat file and return a dict with various process info. Using "man proc" as a reference: where "man proc" refers to position N always subtract 3 (e.g ppid position 4 in 'man proc' == position 1 in here). The return value is cached in case oneshot() ctx manager is in use. r�r�r~�(rrENr�rr�r�r��ttynr� �utime� �stime� �children_utimer��children_stime�� create_time�$�cpu_num�'� blkio_ticksz&can't get blkio_ticks, set iowait to 0)rrdrrr�rr�� IndexErrorr)rerrr�r�rCs r7�_parse_stat_filezProcess._parse_stat_file�sU���t�(�:�:�4�8�:�:�:�;�;���z�z�$�����D�I�I�d�O�O�a�'�$�.�/���d�Q�h�j�j�!�'�'�)�)������F� ��q� ��H� ��Q�i��F� ��a�y��G� ��b�z��G� ��b�z��G� � &�r� �� �� &�r� �� ��#�B�Z��M������I�� #�!'���C� � � ��� #� #� #� �:� ;� ;� ;�!"�C� � � � � #���� � s� C+�+D � D c��t|j�d|j�d���5}|���cddd��S#1swxYwYdS)z�Read /proc/{pid}/stat file and return its content. The return value is cached in case oneshot() ctx manager is in use. r�rXN)rrdrrr�rer�s r7�_read_status_filezProcess._read_status_file�s����D�-�A�A���A�A�A� B� B� �a��6�6�8�8� � � � � � � � � � � � ���� � � � � � s�A�A�Ac���t|j�d|j�d���5}|������cddd��S#1swxYwYdS)Nr�r;)rrdrrrr�r�s r7�_read_smaps_filezProcess._read_smaps_file�s����D�-�@�@���@�@�@� A� A� $�Q��6�6�8�8�>�>�#�#� $� $� $� $� $� $� $� $� $� $� $� $���� $� $� $� $� $� $s�&A�A�Ac��|j�|��|j�|��|j�|��dSrw)r��cache_activater�r�r�s r7� oneshot_enterzProcess.oneshot_enter�sM�� ��,�,�T�2�2�2� ��-�-�d�3�3�3� ��,�,�T�2�2�2�2�2r9c��|j�|��|j�|��|j�|��dSrw)r��cache_deactivater�r�r�s r7� oneshot_exitzProcess.oneshot_exit�sM�� ��.�.�t�4�4�4� ��/�/��5�5�5� ��.�.�t�4�4�4�4�4r9c�P�t|���d��S)Nr�)rr�r�s r7r�z Process.name�s#���d�+�+�-�-�f�5�6�6�6r9c��� t|j�d|j�d���S#ttf$rG|���t j�|j�d|j����rYdS�wxYw)Nr�z/exer�) r�rdrrrmrnr�r�rx�lexistsr�s r7�exez Process.exe�s��� ��t�0�A�A�4�8�A�A�A�B�B� B��!�#5�6� � � � � !� !� #� #� #��w���$�"3�@�@�d�h�@�@�A�A� ��r�r� � ���s�!�AA9�7A9c���t|j�d|j�d���5}|���}ddd��n #1swxYwY|s|���gS|�d��rdnd}|�|��r |dd�}|�|��}|dkr,t|��dkrd|vr|�d��}|S)Nr�z/cmdliner�r�rjr)rrdrrrr�r�r�r�)rer�r�sep�cmdlines r7r�zProcess.cmdline�s'�� �$�+�@�@�d�h�@�@�@� A� A� �Q��6�6�8�8�D� � � � � � � � � � � ���� � � � �� � � !� !� #� #� #��I�� � �f�-�-�6�f�f�3�� �=�=�� � � �����9�D��*�*�S�/�/�� �&�=�=�S��\�\�Q�.�.�3�$�;�;��j�j��o�o�G����A�A�Ac��t|j�d|j�d���5}|���}ddd��n #1swxYwYt |��S)Nr�z/environ)rrdrrrr)rer�rs r7�environzProcess.environs��� �$�+�@�@�d�h�@�@�@� A� A� �Q��6�6�8�8�D� � � � � � � � � � � ���� � � � �"�4�(�(�(r�c��t|���d��}tj��} ||S#t$rYdSwxYw)Nr�)r�r�r�get_terminal_mapr�)re�tty_nrrcs r7�terminalzProcess.terminals_���T�*�*�,�,�W�5�6�6���(�*�*�� ���<� ��� � � ��4�4� ���s�A� A�Ar:�/ioc �4�|j�d|j�d�}i}t|��5}|D]T}|���}|r< |�d��\}}t |��||<�D#t $rY�PwxYw�U ddd��n #1swxYwY|s|�d�}t|��� t|d|d|d|d|d |d ��S#t$r*}|j d �d |�d |��}t |��d�d}~wwxYw)Nr�r�s: z file was emptyssyscrssyscws read_bytess write_bytessrcharswcharrz field was not found in z; found fields are ) rdrrrr�r�r�rr�r�r�r�) re�fnamer�r�r�r�r'r�r�s r7� io_counterszProcess.io_counters$s����(�8�8�4�8�8�8�8�E��F��U�#�#� 6�q�� 6� 6�D��:�:�<�<�D��6�6�*.�*�*�U�*;�*;�K�D�%� ,/�u�:�:�F�4�L�L�� *�%�%�%�$�H�%����6� 6� 6� 6� 6� 6� 6� 6� 6� 6� 6� 6� 6���� 6� 6� 6� 6�� (��/�/�/��"�3�'�'�'� 0���8�$��8�$��=�)��>�*��8�$��8�$� ����� 0� 0� 0��x��{�.�.�e�.�.�#)�.�.��!��o�o�4�/�����  0���sM�B �A+�B �+ A8�5B �7A8�8B � B �B �+7C#�# D�-%D�Dc�r�|���}t|d��tz }t|d��tz }t|d��tz }t|d��tz }t|d��tz }t|||||��S)Nr�r�r�r�r�)r�rrr�)rer�r�r�r�r�r�s r7rzProcess.cpu_timesGs����&�&�(�(���f�W�o�&�&��4���f�W�o�&�&��4���v�&6�7�8�8�;�F���v�&6�7�8�8�;�F���v�m�,�-�-� �;�����~�~�v�N�N�Nr9c�P�t|���d��S)zWhat CPU the process is on.r��r�r�r�s r7r�zProcess.cpu_numQs#���4�(�(�*�*�9�5�6�6�6r9Nc�B�tj|j||j��Srw)r�wait_pidrrr�)re�timeouts r7�waitz Process.waitVs��� ���7�D�J�?�?�?r9c��t|���d��}tp t��}|tz |zS)Nr�)rr�rvrwr)re�ctime�bts r7r�zProcess.create_timeZs@���d�+�+�-�-�m�<�=�=�� � %�)�+�+��� �#�r�)�)r9c ��t|j�d|j�d���5}d�|������dd�D��\}}}}}}}ddd��n #1swxYwYt |||||||��S)Nr�z/statmc3�DK�|]}t|��tzV��dSrw)r�r�r4s r7� <genexpr>z&Process.memory_info.<locals>.<genexpr>ss>����8�8�&'��A����!�8�8�8�8�8�8r9r�)rrdrrr�r�r}) rer��vmsr�rk�text�libr�dirtys r7� memory_infozProcess.memory_infoes����D�-�@�@���@�@�@� A� A� �Q�8�8�+,�:�:�<�<�+=�+=�+?�+?����+C�8�8�8� 4�C��f�d�C��u� � � � � � � � � � � ���� � � � ��C��f�d�C��u�=�=�=s�AA-�-A1�4A1c��dx}x}}t|j�d|j�d���5}|D]�}|�d��r.|t |���d��dzz }�E|�d��r+t |���d��dz}��|�d��r*t |���d��dz}�� ddd��n #1swxYwY|||fS) Nrr�r<sPrivate_rr��Pss:�Swap:)rrdrrr2r�r�)rerr�r�r�r�s r7�_parse_smaps_rollupzProcess._parse_smaps_rollupzsR�� !� �C� �#����$�>�>�t�x�>�>�>��� ;���;�;�D����{�3�3�;��s�4�:�:�<�<��?�3�3�d�:�:�������1�1�;�!�$�*�*�,�,�q�/�2�2�T�9�������2�2�;�"�4�:�:�<�<��?�3�3�d�:���;� ;� ;� ;� ;� ;� ;� ;� ;� ;� ;� ;���� ;� ;� ;� ;���d�#� #s�CC;�;C?�C?s\nPrivate.*:\s+(\d+)s\nPss\:\s+(\d+)s\nSwap\:\s+(\d+)c��|���}ttt|�|������dz}ttt|�|������dz}ttt|�|������dz}|||fS)Nr�)r�rr�r��findall)re� _private_re�_pss_re�_swap_re� smaps_datarr�r�s r7� _parse_smapszProcess._parse_smaps�s���*�.�.�0�0�J��c�#�{�2�2�:�>�>�?�?�@�@�4�G�C��c�#�w���z�:�:�;�;�<�<�t�C�C��s�3�� 0� 0�� <� <�=�=�>�>��E�D���d�#� #r9c��trI |���\}}}nG#ttf$r|���\}}}YnwxYw|���\}}}|���}t ||||fz�Srw)�HAS_PROC_SMAPS_ROLLUPr�rnrmr�r�r~)rerr�r�� basic_mems r7�memory_full_infozProcess.memory_full_info�s���$� 5�9�%)�%=�%=�%?�%?�N�C��d�d��*�,=�>�9�9�9�%)�%6�%6�%8�%8�N�C��d�d�d�9����"&�!2�!2�!4�!4���S�$��(�(�*�*�I��Y�#�s�D�)9�9�:� :s�"�)A� Ac��d�}|���}|s|���gS|�d��}g}|�d��}|g}|||��D�]�\}}|�dd��} |\} } } } } }n#t$r|dgz\} } } } } }YnwxYw|sd}nQt |��}|���}|�d��rt|��s |dd �}t | ��t | ��||� d d��|� d d��|� d d��|� d d��|� dd��|� dd��|� dd��|� dd��|� dd��|� dd��f }|� |�����|S)a�Return process's mapped memory regions as a list of named tuples. Fields are explained in 'man proc'; here is an updated (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0. /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if CONFIG_MMU kernel configuration option is not enabled. c3��K�i}|D]�}|�dd��}|d�d��s.|���|fV�|�|���a t |d��dz||d<��#t $r3|d�d��rY��d|��}t |��d�wxYw|���|fV�dS)N�rr2rr�sVmFlags:z!don't know how to interpret line )r�r��popr�r�rr2)r�� current_blockrr�r�r�s r7� get_blocksz'Process.memory_maps.<locals>.get_blocks�s������!�<�<�D�!�Z�Z��a�0�0�F�!�!�9�-�-�d�3�3� <�,�0�0�2�2�D�9�9�9�9�%�,�,�T�2�2�2�2�<�.1�&��)�n�n�t�.C�D����O�O��)�<�<�<�%�a�y�3�3�K�@�@�)� (��"N�d�"N�"N�C�",�S�/�/�t�;� <���� %�(�(�*�*�D�1�1�1�1�1�1s�)!B � %C�2C� rNr�r�z[anon]r�r�sRss:sSize:r�s Shared_Clean:s Shared_Dirty:sPrivate_Clean:sPrivate_Dirty:s Referenced:s Anonymous:r�) r�r�r�r�rrr�r�rr�r�)rer�rr�r � first_liner��header�hfieldsr��perms�_offset�_dev�_inoderxrps r7� memory_mapszProcess.memory_maps�s9�� 2� 2� 2�&�(�(�*�*�D�� ��%�%�'�'�'�� ��J�J�u�%�%�E��B����1���J�'�L�M� *� �5�-� @� @� � � ��� �,�,�t�Q�/�/��N�?F�<�D�%��$�����!�N�N�N�?F�"��~�<�D�%��$�����N�����*�#�D�D�!�$�<�<�D��:�:�<�<�D��}�}�\�2�2�*�;M��<�<�*� $�D�S�D�z���4�L�L��5�M�M���H�H�W�a�(�(��H�H�X�q�)�)��H�H�W�a�(�(��H�H�-�q�1�1��H�H�-�q�1�1��H�H�.��2�2��H�H�.��2�2��H�H�^�Q�/�/��H�H�]�A�.�.��H�H�X�q�)�)���� � �$������Is� B�B,�+B,c�@�t|j�d|j�d���S)Nr�z/cwd)r�rdrrr�s r7�cwdz Process.cwds&���4�,�=�=�t�x�=�=�=�>�>�>r9sctxt_switches:\t(\d+)c��|���}|�|��}|s"d|j�d|j�d�}t |���t jt|d��t|d����S)NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in r�z1/status; the kernel is probably older than 2.6.23rr)r�r�rdrrr@r�pctxswr�)re� _ctxsw_rer�ctxswr�s r7�num_ctx_switcheszProcess.num_ctx_switches s����%�%�'�'���!�!�$�'�'��� +�.��%�.�.�(,��.�.�.� � &�c�*�*� *��~�c�%��(�m�m�S��q��]�]�;�;�;r9sThreads:\t(\d+)c�z�|���}t|�|��d��S�Nr)r�r�r�)re�_num_threads_rers r7� num_threadszProcess.num_threadss6���%�%�'�'���?�*�*�4�0�0��3�4�4�4r9c��tj|j�d|j�d���}|���g}d}|D�]'}|j�d|j�d|�d�} t |��5}|������}ddd��n #1swxYwYn#ttf$rd}Y�|wxYw||� d��dzd�}|� d ��}t|d ��tz } t|d ��tz } tjt!|��| | ��} |�| ����)|r|���|S) Nr�z/taskFz/task/r�Tr~rEr�r�r�)r�rlrdrrr=rrr�rmrnrr�rrr�pthreadr�r�r�) re� thread_idsr"� hit_enoent� thread_idr�r��str�r�r�r(s r7�threadszProcess.threads!s����Z�4�#4� F� F�t�x� F� F� F�G�G� ���������� �#� #� #�I��(�K�K�4�8�K�K�9�K�K�K�E� � ��'�'�*�1��������)�)�B�*�*�*�*�*�*�*�*�*�*�*����*�*�*�*���%�'9�:� � � �"� ���  ���� �B�G�G�D�M�M�A�%�'�'�(�B��X�X�d�^�^�F��&��*�%�%� �3�E��&��*�%�%� �3�E��_�S��^�^�U�E�B�B�F� �N�N�6� "� "� "� "� � '� � $� $� &� &� &��s6�B&�''B� B&�B �B&�!B �"B&�&B<�;B<c�4�tj|j��Srw)r�� getpriorityrrr�s r7�nice_getzProcess.nice_get<s���%�d�h�/�/�/r9c�6�tj|j|��Srw)r�� setpriorityrr)rer's r7�nice_setzProcess.nice_setEs���%�d�h��6�6�6r9c�4�tj|j��Srw)r�r>rrr�s r7�cpu_affinity_getzProcess.cpu_affinity_getLs���-�d�h�7�7� 7r9sCpus_allowed_list:\t(\d+)-(\d+)c �f�|���}|�|��}|rRttt |dd��t |dd��dz����Sttt t ��������S)Nrr)r�r�rk�ranger�r�r )re�_rerrs r7�_get_eligible_cpuszProcess._get_eligible_cpusPs����)�)�+�+�D��K�K��%�%�E�� 9��E�#�e�A�h�q�k�"2�"2�C��a��� �4D�4D�q�4H�I�I�J�J�J��E�#�m�o�o�"6�"6�7�7�8�8�8r9c ��� tj|j|��dS#ttf$r�}t |t��s|jt jkr�|���}tttt��������}|D]:}||vrd|�d|��}t |��d�||vrd|�d|��}t |��|��;�d}~wwxYw)Nz invalid CPU z; choose between z CPU number z! is not eligible; choose between ) r��proc_cpu_affinity_setrrr�rr�rorpr�tuplerr�r )rer r�� eligible_cpus�all_cpus�cpur�s r7�cpu_affinity_setzProcess.cpu_affinity_set[s-�� ��*�4�8�T�:�:�:�:�:���Z�(� � � ��c�:�.�.�;�#�)�u�|�2K�2K�$(�$;�$;�$=�$=�M�$�U�3�}���+?�+?�%@�%@�A�A�H�#� ;� ;���h�.�.�!6�s�!6�!6�$1�!6�!6� �#-�S�/�/�t�;��m�3�3�!<�c�!<�!<�,9�!<�!<� �#-�S�/�/�s�:� 4� �����# ���s��C%�B1C � C%c��tj|j��\}}t|��}t j||��Srw)r�r=rrrDr�pionice)re�ioclassr's r7� ionice_getzProcess.ionice_getus7��!�1�$�(�;�;�N�G�U� ��)�)�G��?�7�E�2�2� 2r9c���|�d}|r.|tjtjhvr|�d�}t|���|dks|dkrd}t|���t j|j||��S)Nrz ioclass accepts no valuer�zvalue not in 0-7 range)rDr#r rr��proc_ioprio_setrr)rerr'r�s r7� ionice_setzProcess.ionice_set{s����}���� &���,��,�%���!�=�=�=�� ��o�o�%��q�y�y�E�A�I�I�.�� ��o�o�%��'���'�5�A�A� Ar9r/c�t�|jdkrd}t|��� |�tj|j|��St |��dkrd|��}t|���tj|j||��dS#t $r/}|jt jkr|����d}~wwxYw)Nrz)can't use prlimit() against PID 0 processrEz2second argument must be a (soft, hard) tuple, got ) rrr�resourcer/r�r�ro�ENOSYSr�)re� resource_�limitsr�r�s r7�rlimitzProcess.rlimit�s��� �x�1�}�}�A�� ��o�o�%� ��>�#�+�D�H�i�@�@�@��6�{�{�a�'�'�5�*0�5�5��)��o�o�-��$�T�X�y�&�A�A�A�A�A��� � � ��9�� �,�,��)�)�+�+�+������  ���s�A>�AA>�> B7�*B2�2B7c��|���d}|���}t�|d��S)Nr��?)r�r� PROC_STATUSESr�)re�letters r7r�zProcess.status�s;���&�&�(�(��2��������� � ���-�-�-r9c�6�g}tj|j�d|j�d���}d}|D�]�}|j�d|j�d|��} t |��}|�d���r,t |���r|j�d|j�d|��} t|��5}t|� ��� ��d��}t|� ��� ��dd��} ddd��n #1swxYwYt| ��} t|t|��t|��| | ��} |� | ����O#ttf$rd}Y��ewxYw��k#ttf$rd}Y���t $rK} | jt"jkrYd} ~ ���| jt"jkrt)| ��Yd} ~ ��ςd} ~ wwxYw|r|���|S) Nr�rhFriz/fdinfo/rr�T)r�rlrdrrr�r2rrr�r�r�r�rwr�rmrnr�rorprqrr�) rer"r�rryr�rxr��posr|r{r(r�s r7� open_fileszProcess.open_files�s������ �d�/�?�?�$�(�?�?�?�@�@��� ��& /�& /�B��'�<�<�$�(�<�<��<�<�D�$ /���~�~��&�?�?�3�'�'�/�M�$�,?�,?�/�"�/�H�H�$�(�H�H�B�H�H�D� /�(��.�.�D�!�"%�a�j�j�l�l�&8�&8�&:�&:�1�&=�">�">�C�$'�� � � � �(:�(:�(<�(<�Q�(?��$C�$C�E�D�D�D�D�D�D�D�D�D�D�D����D�D�D�D� 2�%�8�8��!*� �#�b�'�'�3�s�8�8�T�5�"�"�� ���v�.�.�.�.��.�/A�B�*�*�*�&*� � � �*������3&�'9�:� � � �!� ���� � � ��9�� �,�,��H�H�H�H��9�� 2�2�2��#�J�J�J��H�H�H�H������ ����> � '� � $� $� &� &� &��sa�F� E:�A4D� E:�D � E:�#D �$E:�:F�F�H�, H�5G;�$G;�:G;�;HrZc�n�t�||j��}|���|Srw)r�r�rrr�)rer�rCs r7r�zProcess.net_connections�s0���'�'��d�h�7�7�� � � �"�"�"�� r9c�d�ttj|j�d|j�d�����S)Nr�rh)r�r�rlrdrrr�s r7�num_fdszProcess.num_fds�s0���2�:��!2�B�B�T�X�B�B�B�C�C�D�D�Dr9c�P�t|���d��S)Nr�r�r�s r7r�z Process.ppid�s!���4�(�(�*�*�6�2�3�3�3r9sUid:\t(\d+)\t(\d+)\t(\d+)c���|���}|�|��d\}}}tjt |��t |��t |����Sr)r�r�r�puidsr�)re�_uids_rer�real� effective�saveds r7�uidsz Process.uids��X���%�%�'�'��!)�!1�!1�$�!7�!7��!:���i���}�S��Y�Y��I����E� � �C�C�Cr9sGid:\t(\d+)\t(\d+)\t(\d+)c���|���}|�|��d\}}}tjt |��t |��t |����Sr)r�r�r�pgidsr�)re�_gids_rerr8r9r:s r7�gidsz Process.gids�r<r9rw�rZ)>rGrHrIr�rrfr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�rxr��getpidr�rr�r�r�r�r��HAS_PROC_SMAPSr�rrr�r�r�r�r�rr r r�HAS_CPU_AFFINITYrrr�HAS_PROC_IO_PRIORITYr r#�hasattrr%r)r�r0r�r3r�r;r@rJr9r7r�r��s�������'�'�C�C�C�I�.�.�.� "�"�"� B�B�B�3�3�3� ��#�#����_�#�J�������_����$�$����_�$�3�3�3� 5�5�5� �7�7��_�7�� � ��_� �����_��2�)�)��_�)� ����_�� �w�~�~�/�y�r�y�{�{�/�/�/�0�0�#0� � 0� 0� �� 0�D�O�O��_�O��7�7��_�7��@�@�@��_�@��*�*��_�*��>�>��_�>�$�C'��C'� $� $� $�. �#�� �#;�<�<��B�J�2�3�3��R�Z� 4�5�5�  $� $� $� �� $�8 � ;� ;� �� ;� ;�'���H� �E �E � ��E �N�?�?��_�?��"�� �#<�=�=� <� <� <��_� <��*4�"�*�5H�*I�*I�5�5�5��_�5� ����_��4�0�0��_�0��7�7��_�7��&� � 8� 8� �� 8�!�b�j�!D�E�E� 9� 9� 9� 9� � � � �� �.�B� � 3� 3� �� 3� � B� B� �� B��w�x��#�#�� � � � � �� �6�.�.��_�.� �-�-��_�-�^�����_�� �E�E��_�E��4�4��_�4��&�B�J�'D�E�E�D�D�D��_�D� �&�B�J�'D�E�E�D�D�D��_�D�D�Dr9r�rA)F)�r�r�r;�enumror�rr�rr%r]r��sysr�rrr�rrrr�r r�r r r r rrrrrrrrrrrrrrrrr�__extra__all__rFr<�dirr^rxr�rBrCr�rErDrr� getpagesizer�rv� byteorderr�r��IntEnumr�� AF_PACKETrArBrD�globalsry� __members__�STATUS_RUNNING�STATUS_SLEEPING�STATUS_DISK_SLEEP�STATUS_STOPPED�STATUS_TRACING_STOP� STATUS_ZOMBIE� STATUS_DEAD�STATUS_WAKE_KILL� STATUS_WAKING� STATUS_IDLE� STATUS_PARKEDr,r$r%r&r'r(r)r*r+r,r-r.r�rarmrwr}rr~r�r�r�r�r�r�r�r�r�� Exceptionr�r�r�r�r�rr rr(r/r3rJ� net_if_addrsrNrPr�r�r�r�� disk_usager�r�rrLrPrkrmrwrxr{r�r�r�rJr9r7�<module>r_s~ �� %�$�� � � ����� � � � � � � � ����� � � � � � � � � � � � ����� � � � � � � � � � � � �����#�#�#�#�#�#�"�"�"�"�"�"�������������#�#�#�#�#�#�)�)�)�)�)�)�������$�$�$�$�$�$�$�$�$�$�$�$�'�'�'�'�'�'�!�!�!�!�!�!�"�"�"�"�"�"�"�"�"�"�"�"�������������������������$�$�$�$�$�$�"�"�"�"�"�"�������+�+�+�+�+�+� � � � � � �������(�(�(�(�(�(�'�'�'�'�'�'�"�"�"�"�"�"�"�"�"�"�"�"� � � �� �7�8�Y�������F�F�C�C��I�I�F�F�F����.������ <������ <� <� <�=�=������'J� �� � � �'J�'J�'J�K�K���w�t�%6�7�7���7�4�!8�9�9���b�j��&�&� � !�:� !� #� #�� � �� ��)� ����� ��i���V�%5�!6�!6�7��� � � �������������� � ����'�(�(�(� � � � � � "� � � � $� � � � � � � � !� � � � � � � � � �" � "� � � � � � � � � � � � � � !� � � � � � � � � �, � � �K�K�K� L� L�� �*� ���� � �� �J��<�<�<� >� >� ��z�&�>�?�?�� �:�j�$�,�1G�"G� H� H��� ��J�J�J�K�K� � �J������-�*?�!@�!@�@� B� B� ��j��6�6�6�7�7�� �J�{�"�"�"� #� #� ����( � � �$�$�$�& �0�0� ��0�0K����!�!�!�!���K�K�K� �E� 2�3� 2� 2�3�3�3�;� � �;�(:�;�;�C��c�J�J�I�I�I�I�I�I�����K����<�<�<�~B�B�B�J4@�4@�4@�x � � � ���(���:'�'�'�T���2 � � ��7�>�>�;�<�<�/P�����*�A�A�/P�#�#�#�#�NP�P�P��&� � � � � � �I� � � �k�k�k�k�k�k�k�k�\"�>�#�#��+�+�+�+� ,�,�,�^���B� � �f�f�f�f�RH�H�H�H�H�H�H�H�V$�$�$�$�Xs�s�s�l���>W>�W>�W>�~���  �  �  �&=�=�=� !�!�!�B���,���6w D�w D�w D�w D�w D�w D�w D�w D�w D�w Ds� M�N �%N�N 
Memory