85 lines
2 KiB
Text
85 lines
2 KiB
Text
|
#! /usr/bin/env python3
|
||
|
"""System mode daemon."""
|
||
|
|
||
|
from argparse import ArgumentParser
|
||
|
from json import load
|
||
|
from logging import DEBUG, INFO, basicConfig, getLogger
|
||
|
from pathlib import Path
|
||
|
from subprocess import Popen
|
||
|
|
||
|
|
||
|
CONFIG_FILE = Path('/etc/tablet-mode.json')
|
||
|
DESCRIPTION = 'Setup system for laptop or tablet mode.'
|
||
|
EVTEST = '/usr/bin/evtest'
|
||
|
LOG_FORMAT = '[%(levelname)s] %(name)s: %(message)s'
|
||
|
LOGGER = getLogger(__file__)
|
||
|
|
||
|
|
||
|
def get_arguments():
|
||
|
"""Parses the CLI arguments."""
|
||
|
|
||
|
parser = ArgumentParser(description=DESCRIPTION)
|
||
|
parser.add_argument(
|
||
|
'-v', '--verbose', action='store_true',
|
||
|
help='turn on verbose logging')
|
||
|
subparsers = parser.add_subparsers(dest='mode')
|
||
|
subparsers.add_parser('laptop', help='enable laptop mode')
|
||
|
subparsers.add_parser('tablet', help='enable tablet mode')
|
||
|
return parser.parse_args()
|
||
|
|
||
|
|
||
|
def load_configuration():
|
||
|
"""Returns the configuration."""
|
||
|
|
||
|
try:
|
||
|
with CONFIG_FILE.open('r') as cfg:
|
||
|
return load(cfg)
|
||
|
except FileNotFoundError:
|
||
|
LOGGER.warning('Config file %s does not exist.', CONFIG_FILE)
|
||
|
return {}
|
||
|
|
||
|
|
||
|
def disable_device(device):
|
||
|
"""Disables the respective device via evtest."""
|
||
|
|
||
|
return Popen((EVTEST, '--grab', device))
|
||
|
|
||
|
|
||
|
def disable_devices(devices):
|
||
|
"""Disables the given devices."""
|
||
|
|
||
|
subprocesses = []
|
||
|
|
||
|
for device in devices:
|
||
|
subprocess = disable_device(device)
|
||
|
subprocesses.append(subprocess)
|
||
|
|
||
|
for subprocess in subprocesses:
|
||
|
subprocess.wait()
|
||
|
|
||
|
|
||
|
def get_devices(mode):
|
||
|
"""Reads the device from the config file."""
|
||
|
|
||
|
configuration = load_configuration()
|
||
|
devices = configuration.get(mode) or ()
|
||
|
|
||
|
if not devices:
|
||
|
LOGGER.info('No devices configured to disable.')
|
||
|
|
||
|
return devices
|
||
|
|
||
|
|
||
|
def main():
|
||
|
"""Runs the main program."""
|
||
|
|
||
|
arguments = get_arguments()
|
||
|
level = DEBUG if arguments.verbose else INFO
|
||
|
basicConfig(level=level, format=LOG_FORMAT)
|
||
|
devices = get_devices(arguments.mode)
|
||
|
disable_devices(devices)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|