1*9c5db199SXin Li# Lint as: python2, python3 2*9c5db199SXin Li# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 4*9c5db199SXin Li# found in the LICENSE file. 5*9c5db199SXin Li# Lint as: python3 6*9c5db199SXin Li""" Udevadm helper classes and functions. 7*9c5db199SXin Li""" 8*9c5db199SXin Li 9*9c5db199SXin Liimport subprocess 10*9c5db199SXin Li 11*9c5db199SXin Liclass UdevadmInfo(): 12*9c5db199SXin Li """ Use udevadm info on a specific path. 13*9c5db199SXin Li """ 14*9c5db199SXin Li 15*9c5db199SXin Li @classmethod 16*9c5db199SXin Li def GetProperties(cls, syspath): 17*9c5db199SXin Li """ Get all properties of given syspath as a dict. 18*9c5db199SXin Li 19*9c5db199SXin Li Args: 20*9c5db199SXin Li syspath: System path to get properties for. 21*9c5db199SXin Li 22*9c5db199SXin Li Returns: 23*9c5db199SXin Li Dict with attribute/property as key and it's value. All keys are 24*9c5db199SXin Li converted to lowercase. Example: {'subsystem': 'input'} 25*9c5db199SXin Li """ 26*9c5db199SXin Li props = {} 27*9c5db199SXin Li rawprops = subprocess.check_output(' '.join( 28*9c5db199SXin Li ['udevadm', 'info', '-q', 'property', '-p', syspath]), 29*9c5db199SXin Li shell=True) 30*9c5db199SXin Li 31*9c5db199SXin Li for line in rawprops.splitlines(): 32*9c5db199SXin Li upper_key, value = line.split(b'=', 1) 33*9c5db199SXin Li props[upper_key.lower()] = value.strip(b'"') 34*9c5db199SXin Li 35*9c5db199SXin Li return props 36*9c5db199SXin Li 37*9c5db199SXin Liclass UdevadmTrigger(): 38*9c5db199SXin Li """ Use udevadm trigger with specific rules. 39*9c5db199SXin Li """ 40*9c5db199SXin Li 41*9c5db199SXin Li def __init__(self, 42*9c5db199SXin Li verbose=True, 43*9c5db199SXin Li event_type=None, 44*9c5db199SXin Li attr_match=[], 45*9c5db199SXin Li attr_nomatch=[], 46*9c5db199SXin Li subsystem_match=[], 47*9c5db199SXin Li subsystem_nomatch=[]): 48*9c5db199SXin Li """ Constructor 49*9c5db199SXin Li 50*9c5db199SXin Li Args: 51*9c5db199SXin Li verbose: Whether to output triggered syspaths 52*9c5db199SXin Li event_type: What type of events to trigger (device or subsystem) 53*9c5db199SXin Li attr_match: What attributes to match 54*9c5db199SXin Li attr_nomatch: What attributes not to match 55*9c5db199SXin Li subsystem_match: What subsystems to match 56*9c5db199SXin Li subsystem_nomatch: What subsystems not to match 57*9c5db199SXin Li """ 58*9c5db199SXin Li cmd = ['udevadm', 'trigger'] 59*9c5db199SXin Li 60*9c5db199SXin Li if verbose: 61*9c5db199SXin Li cmd.append('-v') 62*9c5db199SXin Li 63*9c5db199SXin Li if event_type: 64*9c5db199SXin Li cmd.append('-t') 65*9c5db199SXin Li cmd.append('"{}"'.format(event_type)) 66*9c5db199SXin Li 67*9c5db199SXin Li for attr in attr_match: 68*9c5db199SXin Li cmd.append('-a') 69*9c5db199SXin Li cmd.append('"{}"'.format(attr)) 70*9c5db199SXin Li 71*9c5db199SXin Li for attr in attr_nomatch: 72*9c5db199SXin Li cmd.append('-A') 73*9c5db199SXin Li cmd.append('"{}"'.format(attr)) 74*9c5db199SXin Li 75*9c5db199SXin Li for subsystem in subsystem_match: 76*9c5db199SXin Li cmd.append('-s') 77*9c5db199SXin Li cmd.append('"{}"'.format(subsystem)) 78*9c5db199SXin Li 79*9c5db199SXin Li for subsystem in subsystem_nomatch: 80*9c5db199SXin Li cmd.append('-S') 81*9c5db199SXin Li cmd.append('"{}"'.format(subsystem)) 82*9c5db199SXin Li 83*9c5db199SXin Li self.cmd = cmd 84*9c5db199SXin Li 85*9c5db199SXin Li def DryRun(self): 86*9c5db199SXin Li """ Do a dry run using initialized trigger rules. 87*9c5db199SXin Li 88*9c5db199SXin Li Returns: 89*9c5db199SXin Li List of syspaths that would be triggered. 90*9c5db199SXin Li """ 91*9c5db199SXin Li cmd = self.cmd + ['-n'] 92*9c5db199SXin Li lines = subprocess.check_output(' '.join(cmd), shell=True) 93*9c5db199SXin Li return lines.splitlines() if lines else [] 94