xref: /aosp_15_r20/external/autotest/client/cros/udev_helpers.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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