
    7jr                         d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZmZ d Zdd	Zd
 ZddZd Zd Zd Zd Zy)z!OS-specific functions for: Linux
    N)Path)cli)QMK_FIRMWAREBOOTLOADER_VIDS_PIDS   )CheckStatusrelease_infoc                  ^    dt        j                         j                  j                         v S )N	microsoft)platformunamereleaselower     M/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/cli/doctor/linux.py_is_wslr      s#    (..*2288:::r   c                 X    d}|r
d| d|d}nd| z  }|rdj                  |g|      }|S )z, Helper function that return udev rules
     %SUBSYSTEMS=="usb", ATTRS{idVendor}=="", ATTRS{idProduct}=="z", TAG+="uaccess"z8SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", TAG+="uaccess", )join)vidpidargsrules       r   
_udev_ruler      sB     D


 JCOyy$'Kr   c           	         t               }| j                         D ]m  }t               ||<   | |   D ]V  }|dk(  s|dk(  r&||   j                  t	        |d   |d   d             3||   j                  t	        |d   |d                X o |S )Ncaterinazmd-bootr   r   zENV{ID_MM_DEVICE_IGNORE}="1")dictkeyssetaddr   )bootloader_vids_pidsrulesblvid_pids       r   _generate_desired_rulesr)   !   s    FE"'') BEb	+B/ 	BGZ2?b	jWQZA_`ab	jWQZ@A		BB Lr   c                 "    |r	d| d|dS d| z  S )z Helper function that return udev rules

    Note: these are no longer the recommended rules, this is just used to check for them
    r   r   z", MODE:="0666"z6SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", MODE:="0666"r   )r   r   s     r   _deprecated_udev_ruler+   -   s    
 cfhkllG#MMr   c                  z   t         j                  } t        d      t        d      t        d      t        d      g}t        t              }t        dd      t        dd      t        dd      ht        d	      ht        d
d      t        dd      ht        dd      hddht        d      hd}t        d |D              rr|D cg c]  }|j                  d      D ]  }|  }}}t               }|D ]h  }	 |j                  d      j                  d      D ]A  }|j                         }|j                  d      r%t        |      s1|j                  |       C j |j'                         D ]  \  }	}
|
j)                  |      r|j+                  |	      }|r2|j)                  |      r!t         j"                  j-                  d|	       ]|	dk(  r)t/               rt         j"                  j-                  d       t         j0                  } t         j"                  j-                  d|	t2                | S t         j"                  j-                  d       t         j"                  j%                  d d!j5                  d" |D                     | S c c}}w # t        $ r$ t         j"                  j%                  d|       Y w xY w)#z(Make sure the udev rules look good.
    z/usr/lib/udev/rules.d/z/usr/local/lib/udev/rules.d/z/run/udev/rules.d/z/etc/udev/rules.d/03eb2ff42ffb2ff01c111eaf00030483df1116c005dfz5ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"z5ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"feed)z	atmel-dfukiibohdstm32bootloadhidr    tmkc              3   <   K   | ]  }|j                           y wN)exists.0udev_dirs     r   	<genexpr>z#check_udev_rules.<locals>.<genexpr>O   s     
78??
7s   z*.ruleszutf-8)encoding
#zFailed to read: %sz{fg_yellow}Found old, deprecated udev rules for '%s' boards. The new rules on https://docs.qmk.fm/#/faq_build?id=linux-udev-rules offer better security with the same functionality.r    z{fg_yellow}Detected ModemManager without the necessary udev rules. Please either disable it or set the appropriate udev rules if you are using a Pro Micro.zv{fg_yellow}Missing or outdated udev rules for '%s' boards. Run 'sudo cp %s/util/udev/50-qmk.rules /etc/udev/rules.d/'.z@{fg_yellow}Can't find udev rules, skipping udev rule checking...zChecked directories: %sr   c              3   2   K   | ]  }t        |        y wr>   )strr@   s     r   rC   z#check_udev_rules.<locals>.<genexpr>m   s     :cX3x=:cs   )r   OKr   r)   r   r+   anyglobr#   	read_textsplitstrip
startswithlenr$   PermissionErrorr   logdebugitemsissubsetgetwarningcheck_modem_managerWARNINGr   r   )rc	udev_dirsdesired_rulesdeprecated_rulesrB   	rule_file
udev_rulescurrent_rulesline
bootloaderr&   deprecated_rules               r   check_udev_rulesrd   8   s    
B%&+,!"!"	I ,,@AM ,FF;=RSY[a=bdy  {A  CI  eJ  K)&12'79NvW]9^_-ff=>L  OF  G%f-. 
7Y
7709dH8==YbKcdiidid
d $ 	?I?%///AGGM 0D::<D??3/CI%))$/0	? "/!4!4!6 	xJ>>-0"2"6"6z"B"'?'?'NGGOO  %[  ]g  h "Z/4G4I  )F  G$,,BGGOO  %]  _i  kw  x	x" I 	Z[/:cYb:c1cdI? e # ?2I>?s%   J5AJ;JJ)J:9J:c                  >    t        t        j                  d            S )z#Check if it's a systemd system
    	systemctl)boolshutilwhichr   r   r   check_systemdrj   r   s     [)**r   c                  n    t               r*t        j                  g dd      } | j                  dk(  ryy	 y)z.Returns True if ModemManager is running.

    )rf   z--quietz	is-activezModemManager.service
   )timeoutr   TF)rj   r   run
returncode)mm_checks    r   rX   rX   x   s9     77Xbde!# 	r   c                     t               } | j                  d| j                  dd            }t               rdnd}t        j                  j                  d| | d       t               rbt        j                         j                  d      r/t        j                  j                  d	       t        j                  S t        j                  S t               }|t        j                  k7  r|S t        j                  S )
z"Run the Linux specific tests.
    PRETTY_NAMEIDUnknownzWSL, r   zDetected {fg_cyan}Linux (z){fg_reset}.z/mntz.I/O performance on /mnt may be extremely slow.)r	   rV   r   r   rR   infor   as_posixrO   rW   r   rY   rd   rI   )ru   
release_idplatrZ   s       r   os_test_linuxry      s     >D-$	)BCJi7RDGGLL.tfZLOP y  "--f5GGOOLM&&& >>	 I>>r   r>   )__doc__r   rh   pathlibr   milcr   qmk.constantsr   r   checkr   r	   r   r   r)   r+   rd   rj   rX   ry   r   r   r   <module>r      sF        < ,; 	N7t+r   