From 352acb1f4b55e7f7e797cefaecbc3576f3a05277 Mon Sep 17 00:00:00 2001 From: lanxu Date: Sat, 18 May 2019 13:04:02 +0300 Subject: [PATCH] Added udevmonitord to monitor udev changes --- udevmonitord.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 udevmonitord.py diff --git a/udevmonitord.py b/udevmonitord.py new file mode 100755 index 0000000..0275221 --- /dev/null +++ b/udevmonitord.py @@ -0,0 +1,94 @@ +#!/usr/bin/python + +""" +udevmonitord runs in the background and monitors changes in plugged devices + +Examples: + +# Print to console +./udevmonitord.py -s 'echo "Device $action $sys_name:$sys_number, $device_type"' + +# Show notification +./udevmonitord.py -s 'notify-send "Device $action $sys_name:$sys_number, $device_type"' + +# Run script +./udevmonitord.py -s /home/lanxu/Scripts/echo.sh + +""" +import os +import re +import sys +import getopt + +import pyudev +import subprocess + +import logging + + +__author__ = 'lanxu ' + +LOGGING_FORMAT = "%(asctime)s %(levelname)s %(message)s" + +def main(argv): + ''' main function to parse input and setup logging''' + loglevel = logging.ERROR + log_file = __file__ + '.log' + script_file = None + + try: + opts, args = getopt.getopt(argv,"hs:l:v",["scriptfile=","logfile="]) + except getopt.GetoptError: + print('test.py -i -o ') + sys.exit(1) + + for opt, arg in opts: + if opt == '-h': + print(__file__ + ' -l logfile.log -s script.sh [-v]') + sys.exit() + elif opt in ("-v", "--verbose"): + loglevel = logging.DEBUG + elif opt in ("-l", "--logfile"): + log_file = arg + elif opt in ("-s", "--scriptfile"): + script_file = arg + + logging.basicConfig(format=LOGGING_FORMAT, level=loglevel, handlers=[logging.FileHandler(log_file), logging.StreamHandler()]) + monitor(script_file) + +def monitor(script_file): + ''' Start monitoring main loop''' + context = pyudev.Context() + monitor = pyudev.Monitor.from_netlink(context) + + # Iterate over polled devices + for device in iter(monitor.poll, None): + # Filter out none types + if device.device_type is not None: + args = { + 'action': device.action, + 'sys_name': device.sys_name, + 'sys_number': device.sys_number, + 'driver': device.driver, + 'device_type': device.device_type + } + logging.debug(args) + + # Run script if it is defined + if script_file: + script_env = os.environ.copy() + for key, value in args.items(): + if value is not None: + script_env[key] = value + try: + subprocess.run([script_file], shell=True, check=True, env=script_env) + except: + logging.error('Something went wrong!') + + + +if __name__ == "__main__": + main(sys.argv[1:]) + + +