Your IP : 216.73.217.85


Current Path : /opt/imh-scan/__pycache__/
Upload File :
Current File : //opt/imh-scan/__pycache__/clamlib.cpython-313.pyc

�

�h�X��>�SrSSKJr SSKrSSKrSSKrSSKJr SSKrSSK	r	SSK
r
SSKrSSKrSSK
r
SSKJr SSKrSSKrSSKJrJr SSKJrJrJr SSKJrJrJr SS	KJr SSKrSSKrSSK r SSK!r!SSK"J#r$ SS
K%J&r& \RN"5S:Hr(Sr)Sr*S
r+Sr,Sr-Sr.Sr/\0"\"SS9Rc55r2\Rf"S\Rh5r5\Rf"S5r6\"\Rn"\Rp"55Rr5r:\Rf"S5r;\"SS55r<"SS\
Rz5r>"SS5r?Sr@S\AS\B\AS \A4S!jrCS"\D\AS \\AS44S#jrESS$.S%\D\S&\\AS44S'jjrFS(\S)\4S*jrGS+rHg),zClamscan and freshclam classes�)�	ExitStackN)�Path)�	dataclass)�IO�Union)�Popen�CalledProcessError�TimeoutExpired)�run�DEVNULL�PIPE)�	timedelta)�Procz,https://repo.imhadmin.net/open/shellscan/v3/)zimh.yara)zheuristic.yaraz/opt/imh-scan/sigs/heuri/z/opt/imh-scan/sigs/yara/z!/opt/imh-scan/sigs/last_freshclamz/opt/imh-scan/sigs/new/new.yara�)�weeksz(.*)\: (.*) FOUND$z(?:YARA.)?[Hh]euristicz (/home[0-9]?/[a-zA-Z0-9]{1,16})/c��\rSrSr%Sr\\S'\\S'\\	\4\S'\\	\4\S'\\S'\
S\4S	j5r\
S\\	\44S
j5rSr
g)
�
ScanResult�+zClamscan result�rcode�command�
hits_found�
heur_found�summary�returnc
�B�URURURR5VVs0sHup[	U5U_M snnUR
R5VVs0sHup[	U5U_M snnURS.$s snnfs snnf)N�rrrrr)rrr�items�strrr)�self�k�vs   �/opt/imh-scan/clamlib.py�__dict__�ScanResult.__dict__5s����Z�Z��|�|�15���1F�1F�1H�I�1H���3�q�6�1�9�1H�I�15���1F�1F�1H�I�1H���3�q�6�1�9�1H�I��|�|�
�	
��J��Is�B
�,Bc�4�URUR-$�N)rr)rs r"�	all_found�ScanResult.all_found?s��������0�0��N)�__name__�
__module__�__qualname__�__firstlineno__�__doc__�int�__annotations__r�dictr�propertyr#r'�__static_attributes__r*r)r"rr+sl����J�
�L��T�3�Y����T�3�Y���
�L�
�
�$�
��
��1�4��c�	�?�1��1r)rc�^�\rSrSrSrS\\SSS\\S\	4U4Sjjr
S	rS
rS\4Sjr
S
\S\S\	SS4SjrSrU=r$)�
ClamParser�Dz"Thread for parsing clamscan stdout�proc�scanner�Scanner�
open_logfiles�print_itemsc�>�[TU]URSS9 XlX lSUlX@l0Ul0Ul/Ul	X0l
UR5 g)NT)�target�daemonF)�super�__init__�parser8r9�_scanning_summary�_print_itemsrr�
summary_linesr;�start)rr8r9r;r<�	__class__s     �r"rA�ClamParser.__init__GsX���	����
�
�4��8��	���!&���'��+-���+-���(*���*���
�
�r)c���UR5H]nUR(a8UR(a
[USS9 URRU5 MLUR
U5 M_ g)N�)�end)�_iter_foundrCrD�printrE�append�
_handle_found�r�lines  r"rB�ClamParser.parseYsS���$�$�&�D��%�%��$�$��$�B�'��"�"�)�)�$�/��"�"�4�(�
'r)c#�r# �SnURRH�nURHnURU5 M UR(aUv� M>URS5(aSUlSnUv� McURS5(aUU3R
5v� SnM�X-
nM� g7f)NrJzSCAN SUMMARY -----------
TzFOUND
)r8�stdoutr;�writerC�endswith�rstrip)r�prevrQ�log_files    r"rL�ClamParser._iter_foundbs�������I�I�$�$�D� �.�.�����t�$�/��%�%��
���}�}�9�:�:�)-��&����
���}�}�Y�'�'���t�f�o�,�,�.�.������%�s�B5B7�datac���[RU5nU(d'URRR	SU5 gUR5up4[
U5nUR5(d'URRR	SU5 g[[RU55=n(aX@RU'OX@RU'URXTU5 g)Nz imh-scan bug: Regex failed on %rzimh-scan bug? %r is not a file)�FOUND_RE�matchr9�log�error�groupsr�is_file�bool�HEURISTIC_RE�searchrr�_print_found)rr[r^�path_str�rule�path�is_heurs       r"rO�ClamParser._handle_foundus������t�$����L�L���"�"�#E�t�L���������H�~���|�|�~�~��L�L���"�"�#C�T�J���<�.�.�t�4�5�5�7�5�$(�O�O�D�!�$(�O�O�D�!����$�g�.r)rirhrjrNc���UR(dgU(a[RO[Rn[	[
R"[U55U"US35SSS9 g)Nz FOUNDz: T)�sep�flush)rD�c�yellow�redrM�shlex�quoter)rrirhrj�colors     r"rf�ClamParser._print_found�sH��� � ��#��������
��K�K��D�	�"�E�T�F�&�/�$:��D�	
r))rDrCrrr;r8r9rE)r+r,r-r.r/rr�listrrcrArBrLrOrfr4�
__classcell__)rGs@r"r6r6Dsu���,���C�j�����B�x�	�
��$)��&/�#�/� 
��
�C�
�$�
�4�
�
r)r6c��\rSrSrSrS\\S\S\S\S\S\S	\S
\S\S\S
\S\S\4SjrS\S
\S\4Sjr	Sr
SrS
\S\4SjrS\S\4Sjr
SrSrS\S\\\\\R*S44S\\4SjrS
\S	\S\S\S\S\S\S\S\4SjrS&S \\S\\\\\R*S44S!\S\4S"jjrS#\4S$jrS%rg)'r:�z(Handles executing clamscan and freshclam�exclude�verbose�extra_heuri�install�update�	heuristic�phishing�
disable_media�disable_excludes�disable_default�disable_freshclam�enable_maldetect�disable_new_yarac
�,�X lX@lXPl[R"SSU(a[
RO[
R[RSS9Ul
URUUU
S9UlURUUUUU
U	UUU
S9	Ulg)zInitializes variablesNzimh_scan.Scannerz%(message)s)ri�name�loglevel�	print_out�fmt)r�r�r�)	r�r�rrzr�r�r|r�r�)r{r}r~�rads�
setup_logging�logging�DEBUG�INFO�sysrTr_�_check_deps�	cmd_paths�
_make_commandr)rrzr{r|r}r~rr�r�r�r�r�r�r�s              r"rA�Scanner.__init__�s���$�������%�%��#�&-�W�]�]�7�<�<��j�j��
����)�)�-�/�+�*�
���
�)�)�'����-�-�#�-�+�*�

��r)c	��[R"5S:H=(a [RS:X+nU(+nU(+=(a U(+nUnSUS/SQS.UUSSS	/S.UUS
/SQS.UUS
S/S.UUS
S/S.S.n/n	/n
0nUR	5GH
up�US:Xa<U
S(a2[U
S5(d[
[R"S55 U
S(dMT[U
S5nU(a"URRSU5 X�U'M�URRSU5 U
S(d/URRSU5 U
RU5 M�U
SS
:wdM�U
SU	;dM�U	RU
S5 GM
 U
(aNURRSU
5 URRSU	5 [R"S5 U	(dU$URU	5nU(d2URRSU	5 [R"S5 U$)zVerror handling and installing of dependencies, only supports
installing from EPEL repor�sharedT�clamav)z/usr/bin/clamscanz
/bin/clamscanz'/usr/local/cpanel/3rdparty/bin/clamscan)�need�permit�pkg�pathszclamav-dataz/var/lib/clamavz/var/clamavzclamav-freshclam)z/usr/bin/freshclamz(/usr/local/cpanel/3rdparty/bin/freshclamz/bin/freshclamz/etc/freshclam.confrJz/usr/local/maldetect/sigs)�clamscan�	clamav-db�	freshclam�	freshconf�maldetr�r�r�z�
maldet-imh is deprecated and no installation found.
This scan will proceed and maldet related errors can be ignored.
If you wish to utilize maldetect, please install from source.
z
found path %szmissing dependancy %sr�z#not permitted to install missing %sr�zmissing pkgs: %szallowed to install: %srz!Failed to install dependancies %s)�os�getuidr��IMH_ROLEr�_find_binaryrMrorqr_�debugr`rNr��exit�
_install_deps)rr�r�r��
shared_permit�clamdb_need�freshclam_need�maldet_need�deps_d�install_list�failed_listr��dep�opts�
found_path�reqs                r"r��Scanner._check_deps�s+���	�	��q�(�J����(�-J�
�)�)��,�,�F�5F�1F��&���'���		�$�'�$�%�!��	�'�'�)��		�'�'�)�)��	�$�'��/��	�M.
��^����������I�C��h��4��<�#�D��M�2�2����������<��%�d�7�m�4�J��������
�;�'�c�
���H�H�N�N�2�C�8���>������D�c�J��"�"�3�'���E�{�b� �T�%�[��%D��#�#�D��K�0�;(�B��H�H�N�N�-�{�;��H�H�N�N�3�\�B��H�H�Q�K���L�� � ��.����H�H�N�N�>��M��H�H�Q�K��r)c��UR(aSnO[SUS3SS9nUS:Xa1URRS5 [R
"S5 [
/S	QU-UR(aSO[S
S9 g
![a;nURRU5 [R
"S5 SnAg
SnAf[a4 URRS
5 [R
"S5 g
f=f)N�yzWould you like to install z? (y|n))r��n)�charsr��exitingr)�yumz-yr}T)rT�checkrzerror running yum, exiting)
r}�
ask_promptr_�warningr�r�rr{r�FileNotFoundErrorr`r	�fatal)rr��ret�excs    r"r��Scanner._install_deps+s����<�<��C��,�S�E��9� ��C��#�:��H�H���Y�'��H�H�Q�K�	��(�3�.�#�|�|�t���
���
!�	��H�H�N�N�3���H�H�Q�K�K���"�	��H�H�N�N�7�8��H�H�Q�K��	�s�'B�
D�
1C�>D�Dc���[R"5S-
n[R"5SnX!:�a4URRSUU5 [R"S5 OgMT)Nrrz5Load too high to start clamscan (%s/%s), sleeping 30s�)�psutil�	cpu_countr��
getloadavgr_r��time�sleep)r�	cpu_limit�loadavgs   r"�cpu_wait�Scanner.cpu_waitDs^���$�$�&��*�	���m�m�o�a�(�G��"���� � �K����
�
�
�2���r)c�V�[[4Hn[U5RSSSS9 M URRS[[-5 [H(n[U3n[U3nURXV5 M* [H(n[U3n[U3nURXV5 M* UR(aAURRS5 UR5 [R"S5 U(dU(agUR5 g)zUpdates the custom definitionsi�T��mode�parents�exist_okzDefinitions to get: %szJust updating defintionsrN)�DEFS_DIR�HEUR_DIRr�mkdirr_r��	DEF_FILES�
HEUR_FILES�DEFS_SERVER�_download_filer~r��
_freshclamr�r�)rr�r��dir_name�def_file�urlris       r"�update_defs�Scanner.update_defsRs��� �(�*�H���N� � �e�T�D� �I�+������/��Z�1G�H�!�H� �M�(��,�C��Z��z�*�D�����*�"�#�H� �M�(��,�C��Z��z�*�D�����*�#��;�;��H�H���7�8��O�O���H�H�Q�K��/�����r)r��destc��URRSX5 [R"USSS9nUR	5 [[
U5S-S5nURSS9HnURU5 M SSS5 SSS5 [R"US-U5 g!,(df   N1=f!,(df   N:=f![Ra&nURRS	X5 SnANrSnAff=f)
NzDownloading %s to %sTr�)�stream�timeoutz.tmp�wbi )�
chunk_sizez"Unable to retrieve %s, skipping
%s)
r_r��requests�get�raise_for_status�openr�iter_contentrU�RequestExceptionr`r��rename)rr�r�r��file�chunkr�s       r"r��Scanner._download_filegs��������-�s�9�	L����c�$��;�s��$�$�&��#�d�)�f�,�d�3�t�!$�!1�!1�T�!1�!B���
�
�5�)�"C�4�<�	�	�	�$��-��&�4�3��<�;��
�(�(�	L��H�H�N�N�@�#�K�K��	L�sL�C�)C�(B0�C�
C�0
B>	�:C�
C�C�C�D�&D�Dc���[[R"55n[RR	[
5(aUR(dn[[
SS9n[UR5R55nUS-U:�a%URRS5 SSS5 gSSS5 SURS3nURS	U/nURRS
U5 [!U["SS9nUR$H'nUR&(dMUR)U5 M) SSS5 WR,(aURRS5 g[[
SSS9nUR/[1U55 SSS5 UR$R35 g![a,nURRS[
U5 SnAGNBSnAff=f!,(df   GNQ=f!,(df   N�=f![*a&nURRS
U5 SnAgSnAff=f!,(df   N�=f)zRuns freshclam for system�ascii��encodingi�Qz+freshclam ran less than a day ago, skippingNzerror reading %s
%sz--config-file=r�r�zfreshclam command: %s�utf-8)rTr�zERROR: freshclam failed: %sz=ERROR: freshclam failed, database.clamav.net probably offline�w)r0r�r�ri�exists�FRESH_CACHEr~r��read�stripr_r��	Exceptionr`r�r�rr
rTr{�_freshclam_print�OSError�
returncoderUr�close)	r�nowr��last_runr��freshclam_conf�	fresh_cmdr8rQs	         r"r��Scanner._freshclamss����$�)�)�+���
�7�7�>�>�+�&�&�t�{�{��k�G�4��M�"�4�9�9�;�#4�#4�#6�7�H��%�'�#�-����(�(�I���5�4�.�5�*�$�.�.��*E�)F�G���^�^�K�0�.�A�	������.�	�:�	��y���@�D� �K�K�D��<�<� ��)�)�$�/�(�A��?�?��H�H�N�N�#�
�
�
�+�s�W�
5���J�J�s�3�x� �6��������/!�M��H�H�N�N�#9�;��L�L��M��5�4��A�@��
�	��H�H�N�N�8�#�>���	��6�
5�sy�&H�(AG�=H�H+�8H�
H+�I�
H�!H�:H�H�H�
H�
H(�$H+�(H+�+
I�5I�I�
I,c���[R"US9nUR5 URRSU5 g![a URRSU5 gf=f)N)�dirz%s is not writeableFz%s is writeableT)�tempfile�
TemporaryFiler�r�r_r�)rri�testfiles   r"�write_ok�Scanner.write_ok�s`��	��-�-�$�7�H��N�N��	
�����(�$�/���	�	��H�H�N�N�0�$�7��	�s�$A�&A,�+A,�stack�
log_tuplesNrc
�2�/nUH�upEURRSSSS9 Ub6[R"URURUR
5 URURURSSS955 Ub+[R"XERUR
5 URS	S
9 M� U$![a<nURRSU5 [R"S5 SnAN�SnAff=f)N�Tr�z%s
error in _init_logs��ar�r�i�)r�)�parentr�r��chown�pw_uid�pw_gidr�r_r�r�r�rN�
enter_contextr��chmod)rrr�files�log_path�ownerr�s       r"�
_init_logs�Scanner._init_logs�s���
��)�O�H�
����%�%�5�$��%�N��$��H�H�X�_�_�e�l�l�E�L�L�I�
�L�L��#�#�H�M�M�#��M�$H�I�
�� �����<�<����>��N�N��N�&� *�����
������8�#�>��������
�s�AC�
D�2D�Dc
���URSSSSS/n
U(aU
RS5 U(aU
RS5 U(d U
RSURS	/5 U
RS[/5 U(a U
RSURS
/5 U(d@[R
R
[5(aU
RS[/5 U(aU
RS[/5 U(aU
RS5 U(dU
RS5 U	(aU	HnU
RS
U/5 M U
RS5 U
$)Nr�z-rz--normalize=noz--cross-fs=yesz-iz--heuristic-alerts=yesz--phishing-sigs=yesz-dr�r�z7--exclude=\.(jpe?g|png|gif|mp(eg|4|g)|mov|avi|wmv|flv)$z�--exclude=/home[0-9]?/[^/]*/(quarantine*|mail/|etc/|logs/.*(\.tar)?\.gz|tmp/awstats/.*.txt|tmp/webalizer/(.*usage_.*.html|webalizer\.current))z	--excludez--)	r�rN�extendr�r�rir��DUMMYr�)rr�r�rr�r�r|r�r�rz�cmdris            r"r��Scanner._make_command�s%��
�N�N�:�&�����
����J�J�/�0���J�J�,�-���J�J��d�n�n�[�9�:�;��
�
�D�(�#�$���J�J��d�n�n�X�6�7�8��B�G�G�N�N�5�$9�$9��J�J����)�*���J�J��h�'�(���J�J�J�
� ��J�J�9�
�����
�
�K��.�/� ��
�
�4���
r)�
scan_pathsr<c
���[[[U55nU(deURR	5nURU5 URRS[R"[R"U555 [5nURXb5n[U[R "5["SSSS9n[%UUUUS9n	UR'[(S9 U	R5 SSS5 WR.S:a'URR1S	UR.*5 SSS5 WR.S:aaUHZup�[=US
SS9n
U
R?SUR.*S35 UR.S:XaU
R?S5 SSS5 M\ ORW	R@(dAU	RB(d0UH*up�[=USSS9n
U
R?S5 SSS5 M, W	R5 [EUR.[R"U5U	R@U	RBSRU	RF5S9$![*a UR-5 GN�f=f!,(df   GN�=f![2a/ WR-5 URR1S
5 GN�f=f!,(df   GN�=f![4a=n
URR7SU
5 [8R:"S5 Sn
A
GN�Sn
A
ff=f!,(df   GM�=f!,(df   GM�=f)z
Runs clamscanzScan command: %sNr��surrogateescape)�limrT�stderrr��errors)r8r9r;r<)r�rz\The clamscan process was killed with signal %d; continuing with what it found so far, if anyz>Scan interrupted; continuing with what it found so far, if anyzError: clamav fatal error:
 %srrr�z&Scan was interrupted with kill signal �
i����z.This usually means an out-of-memory condition
r�zNo malware detected
rJr)$rv�maprr�copyrr_r�ro�cyanrr�joinrrrr�r�r
r6�wait�COMMAND_TIMEOUTr
�killr�r`�KeyboardInterruptr�r�r�r�r�rUrrrrE)rr!rr<�scan_path_strsrrr;r8�parserr�r�_r�s              r"�scan�Scanner.scan�s����c�#�z�2�3����z��l�l���!���
�
�>�"������+�Q�V�V�E�J�J�s�O�-D�E�&	���� $���� B�
� ����L�L�N�#�#�!(�0�
��!+�!%�$(�*7�(3�	"��(� �I�I�o�I�>����
�%�4����*������K�!�_�_�,��=�L�?�?�Q��)����(�C�'�:�d��J�J�@� �O�O�+�,�B�0�����"�,��
�
�M��
;�:� *��$�$�V�->�->�#-�K�H��h��g�>�$��
�
�#:�;�?�>�$.�	���
���/�/��J�J�s�O��(�(��(�(��G�G�F�0�0�1�
�	
��K .�(� �I�I�K�(��!���&)���I�I�K��H�H�N�N�&����-���F�	��H�H�N�N�<�c�B��H�H�Q�K�K��	��
;�:��?�>�s��
K9�K'�0%J+�
J�#I8�6J�J+�7K'�K9�/AM�2M�8J�J�J�J�
J(	�#J+�+5K$� K'�#K$�$K'�'
K6�1K9�6K9�9
M�2L;�;M�
M	�
M&	rQc��[R"S[R"S5U5n[R"S[R"S5S-U5n[R"S[R
"S5S-U5n[R"S[R"S5U5nURRU5 g)z$Styles clamscan output and prints itz(ClamAV update process started)z\1z!(WARNING|(?:YARA.)?[Hh]euristic):�:z(ERROR):z!((?:main|daily|bytecode)\.c[lv]d)N)	�re�subro�boldrprqr*r_r�rPs  r"r��Scanner._freshclam_print7s����v�v�8�!�&�&��-��N���v�v�0�!�(�(�5�/�C�2G��
���v�v�k�1�5�5��<�#�#5�t�<���v�v�:�A�F�F�5�M�4�P��������r))r�rr}r_r~r{)F)r+r,r-r.r/rvrrcrAr�r�r�r�r�r�r	r�tuplerr�pwd�
struct_passwdrrr�rr3r�r4r*r)r"r:r:�s���2�+
��c��+
��	+
�
�+
��
+
��+
��+
��+
��+
��+
��+
� �+
��+
��+
�Zk��k� �k��	k�Z�2��T��D��*
'�#�
'�S�
'�#�J������t�U�3�+<�+<�d�+B�%C�C�D�E��
�b��	�,0��0��0��	0�
�0��
0��0��0��0��0�l"�	K
���I�K
���t�U�3�+<�+<�d�+B�%C�C�D�E�K
��	K
�

�K
�Z�S�r)r:c��[S5e)NzPrompt timed out)�TimeoutError)�signum�_frames  r"�_prompt_timeoutrBBs��
�)�
*�*r)�linesr�rc�n�SnSnSRU5n[R"[R[5 [R"U5 X0;aE[[R"U5S-5R5R5nX0;aME[R"S5 U$)zSimple yes or no checkeri�:	rJr'r)
r+�signal�SIGALRMrB�alarm�inputror9r��lower)r�rC�one_week�answer�questions     r"r�r�Fs����H�
�F��y�y���H�
�M�M�&�.�.�/�2�
�L�L���
�
��q�v�v�h�'�$�.�/�5�5�7�=�=�?���
�
�L�L��O��Mr)�paths_to_checkc�f�UH+n[RRU5(dM)Us $ g)z!used to find clamav and freshclamN)r�rir�)rMris  r"r�r�Ss)����
�7�7�>�>�$����K��r))�time_strr�rOc	�^�Uc'[[[R"555nU(d[S5 g/nUH�n[R[U55=n(a#[
URS55nUSU3-nO:[RS:Xa[(a[
SU35nO[SU3-nXb;a[SU5 URU5 [X65 M� g![a(n[USU3S	[R S
9 SnAM�SnAff=f)z4Decides the quarantine dir per file and runs jail_mvNzNothing to quarantinerzquarantine/quarantine_r�z"/home/t1bin/quarantine/quarantine_zQuarantine root: %szError: quarantine failed for r')rmr�)rr0r�rM�HOME_REr^r�groupr�r��IS_ROOT�
CUR_USER_HOMErN�jail_mvr�r�r%)r�rO�
printed_roots�	file_pathr^�	user_home�	jail_rootr�s        r"�
jail_filesrZ[s
�����s�4�9�9�;�'�(���
�%�&���M��	��M�M�#�i�.�1�1�5�1��U�[�[��^�,�I�!�&<�X�J�$G�G�I�
�]�]�h�
&�7�7��A�(��L�M�I�%�*@��
�(K�K�I��)��'��3�� � ��+�	��I�)����	���/�	�{�;���Z�Z�	
�
��	�s�*C:�:
D,�D'�'D,rWrYc���URSSSS9 [R"US5 U[UR5RS5-nURSSS9 [R"URU5 [URU5 X R-n[R"X5 [X5 [R"U5 [R"US5 g)z+Quarantine function retaining dir structurerTr��/)r�r�rN)r�r�rrr�lstrip�shutil�copystat�
copy_uid_guidr��copy2�remove)rWrY�dest_dir�	dest_paths    r"rUrUys���
�O�O���t�O�<��H�H�Y����3�y�/�/�0�7�7��<�<�H��N�N�4�$�N�/�
�O�O�I�$�$�h�/��)�"�"�H�-��>�>�)�I�
�L�L��&��)�'��I�I�i���H�H�Y��r)c�>�[R"U5n[R"U5nURUR:XaURUR:Xag[R"XRUR5 g![
a gf=fr&)r��stat�st_uid�st_gidrr�)�src�dst�	src_stats�	dst_statss    r"r`r`�sx�������I������I����I�,�,�,����	� 0� 0�0��
�
����&�&�	�(8�(8�9���
��
�s�#+B�
B�B)Ir/�
contextlibr�getpassr<r��pathlibrrrr^rEr�r��	threading�dataclassesrr�r7�typingrr�
subprocessrr	r
rrr
�datetimerrr�r�r��
rads.colorrtro�cprocrr�rSr�r�r�r�r�r�rr0�
total_secondsr-�compile�DOTALLr]rd�getpwnam�getuser�pw_dirrTrQr�Threadr6r:rBrr;r�rvr�rZrUr`r*r)r"�<module>r~s���$� ��
����
�
�
�	��!��	��@�@�)�)���
�����
�)�)�+��
��<���	�
 �
�&��%��1��)���i�a�(�6�6�8�9��
�:�:�+�R�Y�Y�7���z�z�3�4���S�\�\�'�/�/�"3�4�;�;�<�
�
�*�*�8�
9���1�1��1�0G
��!�!�G
�Tq�q�h
+�
�s�
�5��:�
�#�
���c���u�S�$�Y�/?��CG��d�4�j��u�S�$�Y�/?��<�t����
r)