1 ''' Read-only configuration database. ''' 
   49 "Cannot import the yaml library. Please install the python3 
   50 yaml package, on many distributions known as python3-PyYAML. It is also 
   51 available as a pypi package at https://pypi.python.org/pypi/PyYAML.''' 
   59     ''' Return path added to current dir for __file__. ''' 
   60     return os.path.join(os.path.dirname(os.path.abspath(__file__)), path)
 
   63 def _load_kerneldrivers(configdir):
 
   64     ''' Parse the kerneldrivers.yaml file, discard unavailable 
   68     with open(os.path.join(configdir, 
"kernel-drivers.yaml")) 
as f:
 
   69         cf = yaml.load(f.read())
 
   70     drivers = cf[
'drivers'].copy()
 
   71     for driver 
in cf[
'drivers']:
 
   72         if driver == 
'default':
 
   74         with open(
'/dev/null', 
'w') 
as f:
 
   76                 subprocess.check_output([config.MODINFO, driver],
 
   78             except subprocess.CalledProcessError:
 
   83 class ItemLookupError(Exception):
 
   84     """A lookup failed, either too namy or no matches found. """ 
   89     ''' The configuration selected, and it's sources. ''' 
   92     def __init__(self, cf=None):
 
  102             for key, value 
in cf.items():
 
  103                 setattr(self, key, value)
 
  107         ''' The possible note to display when selected. ''' 
  109             return self.
config[
'note']
 
  115     ''' Reflects the *.yaml files in the configs/ directory. ''' 
  117     def __init__(self, path=None, yamlpath=None):
 
  119         if path 
and os.path.exists(path):
 
  122             raise FileNotFoundError(path)
 
  123         elif os.path.exists(_here(
'configs')):
 
  124             configdir = _here(
'configs')
 
  125         elif os.path.exists(_here(
'../configs')):
 
  126             configdir = _here(
'../configs')
 
  127         elif os.path.exists(_here(
'../../configs')):
 
  128             configdir = _here(
'../../configs')
 
  130             where = 
'configs:../configs' 
  133             raise FileNotFoundError(where)
 
  137         with open(os.path.join(yamlpath, 
"confs_by_driver.yaml")) 
as f:
 
  138             cf = yaml.load(f.read())
 
  139         db[
'lircd_by_driver'] = cf[
'lircd_by_driver'].copy()
 
  140         db[
'lircmd_by_driver'] = cf[
'lircmd_by_driver'].copy()
 
  142         db[
'kernel-drivers'] = _load_kerneldrivers(configdir)
 
  143         db[
'drivers'] = db[
'kernel-drivers'].copy()
 
  144         with open(os.path.join(yamlpath, 
"drivers.yaml")) 
as f:
 
  145             cf = yaml.load(f.read())
 
  146         db[
'drivers'].update(cf[
'drivers'].copy())
 
  147         for key, d 
in db[
'drivers'].items():
 
  149             hint = d[
'device_hint']
 
  153             if hint.startswith(
'"') 
and hint.endswith(
'"'):
 
  155                 hint = hint.replace(
r'\"', 
"@$#!")
 
  156                 hint = hint.replace(
'"', 
'')
 
  157                 hint = hint.replace(
"@$#!", 
'"')
 
  158                 hint = hint.replace(
"\\\\", 
"\\")
 
  159             d[
'device_hint'] = hint
 
  162         for path 
in glob.glob(configdir + 
'/*.conf'):
 
  163             with open(path) 
as f:
 
  164                 cf = yaml.load(f.read())
 
  165             configs[cf[
'config'][
'id']] = cf[
'config']
 
  166         db[
'configs'] = configs
 
  171         ''' The kernel-drivers dictionary, drivers.yaml + kernel-drivers.yaml. 
  173         return self.
db[
'kernel-drivers']
 
  177         ''' The drivers dictionary, drivers.yaml + kernel-drivers.yaml. ''' 
  178         return self.
db[
'drivers']
 
  182         ''' Return dict of parsed config/*.conf files, keyd by id. ''' 
  183         return self.
db[
'configs']
 
  186         ''' Return the list of remotes suggested for a given driver. ''' 
  187         if isinstance(driver, dict):
 
  188             driver = driver[
'id']
 
  190             return self.
db[
'lircd_by_driver'][driver]
 
  195         ''' Return list of lircmd.conf file for given driver or None. ''' 
  196         if isinstance(driver, dict):
 
  197             driver = driver[
'id']
 
  199             return self.
db[
'lircmd_by_driver'][driver]
 
  204         ''' Return the driver (possibly None) suggested for a remote. ''' 
  205         for driver, files 
in self.
db[
'lircd_by_driver'].items():
 
  207                 return self.
db[
'drivers'][driver]
 
  211         ''' Return item (a config) in configs where config[key] == value. ''' 
  212         found = [c 
for c 
in self.
db[
'configs'].values()
 
  213                  if key 
in c 
and c[key] == value]
 
  216                 "find_config: Too many matches for %s, %s): " % (key, value)
 
  217                 + 
', '.join([c[
'id'] 
for c 
in found]))
 
  220                 "find_config: Nothing  found for %s, %s): " % (key, value))
 
  221         found = dict(found[0])
 
  222         if 'device_hint' not in found:
 
  224                 found[
'device_hint'] = \
 
  225                     self.
db[
'drivers'][found[
'driver']][
'device_hint']
 
  227                 found[
'device_hint'] = \
 
  228                     self.
db[
'kernel-drivers'][found[
'driver']][
'device_hint']
 
lircd_conf
Substituted data from driver. 
 
def drivers
The drivers dictionary, drivers.yaml + kernel-drivers.yaml. 
 
def note
The possible note to display when selected. 
 
A lookup failed, either too namy or no matches found. 
 
def configs
Return dict of parsed config/*.conf files, keyd by id. 
 
def find_config
Return item (a config) in configs where config[key] == value. 
 
def lircmd_by_driver
Return list of lircmd.conf file for given driver or None. 
 
modprobe
Substituted data from driver. 
 
label
Name of lircmd.conf file. 
 
Reflects the *.yaml files in the configs/ directory. 
 
lircmd_conf
Name of lircd.conf file. 
 
def remotes_by_driver
Return the list of remotes suggested for a given driver. 
 
modinit
Read-only config dict in db. 
 
def kernel_drivers
The kernel-drivers dictionary, drivers.yaml + kernel-drivers.yaml. 
 
def driver_by_remote
Return the driver (possibly None) suggested for a remote. 
 
config
Read-only driver dict in db.