You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
6.4 KiB
186 lines
6.4 KiB
From afd89cd1a0f41bdfd0bf049e4245258abe7deffb Mon Sep 17 00:00:00 2001
|
|
From: Alec Leamas <leamas.alec@gmail.com>
|
|
Date: Mon, 7 Sep 2015 13:36:30 +0200
|
|
Subject: [PATCH] tools: Add missing file lirc-setup/database.py.
|
|
|
|
---
|
|
tools/Makefile.am | 3 +-
|
|
tools/lirc-setup/database.py | 151 +++++++++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 153 insertions(+), 1 deletion(-)
|
|
create mode 100644 tools/lirc-setup/database.py
|
|
|
|
diff --git a/tools/Makefile.am b/tools/Makefile.am
|
|
index f3fd3c4..d0d820c 100644
|
|
--- a/tools/Makefile.am
|
|
+++ b/tools/Makefile.am
|
|
@@ -85,7 +85,8 @@ pkgpython_PYTHON = lirc-setup/mvc_control.py \
|
|
lirc-setup/mvc_view.py \
|
|
lirc-setup/mvc_model.py \
|
|
lirc-setup/choosers.py \
|
|
- lirc-setup/baseview.py
|
|
+ lirc-setup/baseview.py \
|
|
+ lirc-setup/database.py
|
|
dist_pkgpython_SCRIPTS = lirc-setup/lirc-setup
|
|
dist_pkgpython_DATA = lirc-setup/lirc-setup.ui
|
|
endif
|
|
diff --git a/tools/lirc-setup/database.py b/tools/lirc-setup/database.py
|
|
new file mode 100644
|
|
index 0000000..1c1e70b
|
|
--- /dev/null
|
|
+++ b/tools/lirc-setup/database.py
|
|
@@ -0,0 +1,151 @@
|
|
+''' Simple lirc setup tool - database part.
|
|
+
|
|
+The database is loaded from some YAML files:
|
|
+
|
|
+ - kernel-drivers.yaml: Info on the kernel drivers.
|
|
+ - drivers,yaml, Info on the uerspace drivers, collected from their
|
|
+ compiled information.
|
|
+ - confs_by_driver.yaml: Mapping of drivers -> suggested remote files,
|
|
+ created by irdb-get.
|
|
+
|
|
+The directory used to load these files is (first match used):
|
|
+ - Current directory
|
|
+ - The 'configs' dir.
|
|
+ - The ../../configs
|
|
+
|
|
+Although python cannot guarantee this, the database is designed to be a
|
|
+read-only structure.
|
|
+
|
|
+'''
|
|
+
|
|
+
|
|
+import glob
|
|
+import os
|
|
+import os.path
|
|
+import sys
|
|
+
|
|
+YAML_MSG = '''
|
|
+"Cannot import the yaml library. Please install the python3
|
|
+yaml package, on many distributions known as python3-PyYAML. It is also
|
|
+available as a pypi package at https://pypi.python.org/pypi/PyYAML.'''
|
|
+
|
|
+try:
|
|
+ import yaml
|
|
+except ImportError:
|
|
+ print(YAML_MSG)
|
|
+ sys.exit(1)
|
|
+
|
|
+
|
|
+def _here(path):
|
|
+ ''' Return path added to current dir for __file__. '''
|
|
+ return os.path.join(os.path.dirname(os.path.abspath(__file__)), path)
|
|
+
|
|
+
|
|
+class Config(object):
|
|
+ ''' The configuration selected, and it's sources. '''
|
|
+ # pylint: disable=too-many-instance-attributes
|
|
+
|
|
+ def __init__(self, config=None):
|
|
+ self.device = None # << selected device.
|
|
+ self.driver = {} # << Read-only driver dict in db
|
|
+ self.config = {} # << Read-only config dict in db
|
|
+ self.modinit = "" # << Substituted data from driver
|
|
+ self.modprobe = "" # << Substituted data from driver
|
|
+ self.lircd_conf = "" # << Name of lircd.conf file
|
|
+ self.lircmd_conf = "" # << Name of lircmd.conf file
|
|
+ self.label = "" # << Label for driver + device
|
|
+ if config:
|
|
+ for key, value in config.items():
|
|
+ setattr(self, key, value)
|
|
+
|
|
+
|
|
+class Database(object):
|
|
+ ''' Reflects the *.yaml files in the configs/ directory. '''
|
|
+
|
|
+ def __init__(self, path=None):
|
|
+
|
|
+ if path and os.path.exists(path):
|
|
+ configdir = path
|
|
+ elif path:
|
|
+ raise FileNotFoundError(path)
|
|
+ elif os.path.exists(_here('configs')):
|
|
+ configdir = _here('configs')
|
|
+ elif os.path.exists(_here('../configs')):
|
|
+ configdir = _here('../configs')
|
|
+ else:
|
|
+ raise FileNotFoundError(configdir)
|
|
+ db = {}
|
|
+ with open(os.path.join(configdir, "confs_by_driver.yaml")) as f:
|
|
+ cf = yaml.load(f.read())
|
|
+ db['lircd_by_driver'] = cf['lircd_by_driver'].copy()
|
|
+ db['lirmcd_by_driver'] = cf['lircmd_by_driver'].copy()
|
|
+
|
|
+ with open(os.path.join(configdir, "kernel-drivers.yaml")) as f:
|
|
+ cf = yaml.load(f.read())
|
|
+ db['kernel-drivers'] = cf['drivers'].copy()
|
|
+ db['drivers'] = cf['drivers'].copy()
|
|
+ with open(os.path.join(configdir, "drivers.yaml")) as f:
|
|
+ cf = yaml.load(f.read())
|
|
+ db['drivers'].update(cf['drivers'].copy())
|
|
+ for key, d in db['drivers'].items():
|
|
+ d['id'] = key
|
|
+
|
|
+ configs = {}
|
|
+ for path in glob.glob(configdir + '/*.conf'):
|
|
+ with open(path) as f:
|
|
+ cf = yaml.load(f.read())
|
|
+ configs[cf['config']['id']] = cf['config']
|
|
+ db['configs'] = configs
|
|
+ self.db = db
|
|
+
|
|
+ @property
|
|
+ def kernel_drivers(self):
|
|
+ ''' The kernel-drivers dictionary, drivers.yaml + kernel-drivers.yaml.
|
|
+ '''
|
|
+ return self.db['kernel-drivers']
|
|
+
|
|
+ @property
|
|
+ def drivers(self):
|
|
+ ''' The drivers dictionary, drivers.yaml + kernel-drivers.yaml. '''
|
|
+ return self.db['drivers']
|
|
+
|
|
+ @property
|
|
+ def configs(self):
|
|
+ ''' Return dict of parsed config/*.conf files, keyd by id. '''
|
|
+ return self.db['configs']
|
|
+
|
|
+ def remotes_by_driver(self, driver):
|
|
+ ''' Return the list of remotes suggested for a given driver. '''
|
|
+ if isinstance(driver, dict):
|
|
+ driver = driver['id']
|
|
+ try:
|
|
+ return self.db['lircd_by_driver'][driver]
|
|
+ except KeyError:
|
|
+ return []
|
|
+
|
|
+ def driver_by_remote(self, remote):
|
|
+ ''' Return the driver (possibly None) suggested for a remote. '''
|
|
+ for driver, files in self.db['lircd_by_driver'].items():
|
|
+ if remote in files:
|
|
+ return self.db['drivers'][driver]
|
|
+ return None
|
|
+
|
|
+ def find_config(self, key, value):
|
|
+ ''' Return item (a config) in configs where config[key] == value. '''
|
|
+ found = [c for c in self.db['configs'].values()
|
|
+ if key in c and c[key] == value]
|
|
+ if len(found) > 1:
|
|
+ print("find_config: not properly found %s, %s): " % (key, value)
|
|
+ + ', '.join([c['id'] for c in found]))
|
|
+ return None
|
|
+ elif not found:
|
|
+ print("find_config: Nothing found for %s, %s): " % (key, value))
|
|
+ return None
|
|
+ found = dict(found[0])
|
|
+ if 'device_hint' not in found:
|
|
+ found['device_hint'] = \
|
|
+ self.db['drivers'][found['driver']]['device_hint']
|
|
+ return found
|
|
+
|
|
+
|
|
+# vim: set expandtab ts=4 sw=4:
|
|
--
|
|
2.4.2
|
|
|