summaryrefslogtreecommitdiff
path: root/bin/udev_match
diff options
context:
space:
mode:
Diffstat (limited to 'bin/udev_match')
-rwxr-xr-xbin/udev_match39
1 files changed, 39 insertions, 0 deletions
diff --git a/bin/udev_match b/bin/udev_match
new file mode 100755
index 0000000..de51650
--- /dev/null
+++ b/bin/udev_match
@@ -0,0 +1,39 @@
+#!/usr/bin/python3
+
+import argparse
+import subprocess
+
+parser = argparse.ArgumentParser(description = 'Run a command on matching udev events')
+
+parser.add_argument('-s', '--subsystem')
+parser.add_argument('-m', '--match', action = 'append')
+
+parser.add_argument('command')
+
+args = parser.parse_args()
+
+def process_buf(buf):
+ for m in args.match:
+ if not m in buf:
+ return
+ subprocess.run(args.command, shell = True)
+
+cmdline = ['udevadm', 'monitor', '--property']
+if args.subsystem:
+ cmdline.append('--subsystem-match=' + args.subsystem)
+
+child = subprocess.Popen(cmdline, text = True, stdout = subprocess.PIPE)
+
+# skip first three lines
+[child.stdout.readline() for i in range(3)]
+
+buf = []
+
+while child.poll() is None:
+ line = child.stdout.readline().strip()
+ if not line:
+ process_buf(buf)
+ buf.clear()
+ continue
+
+ buf.append(line)