From 8f47e62b36cae15f989aaaa93caf05d4de258fb7 Mon Sep 17 00:00:00 2001
From: Erovia <erovia@users.noreply.github.com>
Date: Thu, 7 Nov 2019 19:53:03 +0100
Subject: [PATCH] Make the udev rules easier to read and manage

---
 lib/python/qmk/cli/doctor.py | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/lib/python/qmk/cli/doctor.py b/lib/python/qmk/cli/doctor.py
index 80bd013b21..28bf57a7d9 100755
--- a/lib/python/qmk/cli/doctor.py
+++ b/lib/python/qmk/cli/doctor.py
@@ -2,6 +2,7 @@
 
 Check up for QMK environment.
 """
+import os
 import platform
 import shutil
 import subprocess
@@ -9,6 +10,13 @@ import glob
 
 from milc import cli
 
+def _udev_rule(vid, pid = None):
+    """ Helper function that return udev rules
+    """
+    if pid:
+        return 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", ATTRS{idProduct}=="%s", MODE:="0666"' % (vid, pid)
+    else:
+        return 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", MODE:="0666"' % vid
 
 @cli.subcommand('Basic QMK environment checks')
 def doctor(cli):
@@ -18,7 +26,6 @@ def doctor(cli):
 
     TODO(unclaimed):
         * [ ] Compile a trivial program with each compiler
-        * [ ] Check for udev entries on linux
     """
     cli.log.info('QMK Doctor is checking your environment.')
 
@@ -50,15 +57,17 @@ def doctor(cli):
         # Checking for udev rules
         udev_dir = "/etc/udev/rules.d/"
         # These are the recommended udev rules
-        desired_rules = {"dfu": {'SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", MODE:="0666"',
-                                 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", MODE:="0666"',
-                                 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="0666"'},
-                         "tmk": {'SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"'},
-                         "input-club": {'SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", MODE:="0666"'},
-                         "stm32": {'SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", MODE:="0666"',
-                                   'SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666"'},
-                         "caterina": {'ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"',
-                                      'ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"'}}
+        desired_rules = dict(dfu = {_udev_rule("03eb", "2ff4"),_udev_rule("03eb", "2ffb"), _udev_rule("03eb", "2ff0")},
+
+                             tmk = {_udev_rule("feed")},
+
+                             input_club = {_udev_rule("1c11")},
+
+                             stm32 = {_udev_rule("1eaf", "0003"),_udev_rule("0483", "df11")},
+
+                             caterina = {'ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"',
+                                         'ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"'}
+                             )
         if os.path.exists(udev_dir):
             udev_rules = [rule for rule in glob.iglob(os.path.join(udev_dir, "*.rules")) if os.path.isfile(rule)]
             # Collect all rules from the config files