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.
action-manager/modules/redshift.py

78 lines
2.9 KiB

8 years ago
import subprocess
import logging
from .core import AbstractControl, action
logger = logging.getLogger(__name__)
__all__ = ['RedshiftControl']
8 years ago
class RedshiftControl(AbstractControl):
def __init__(self):
super().__init__()
self._redshift_proc = None
def configure(self, argument_parser):
argument_parser.add_argument('--redshift-location', help='LAT:LON Your current location', type=str)
argument_parser.add_argument('--redshift-temperature',
help='DAY:NIGHT Color temperature to set at daytime/night', type=str)
def bind_arguments(self, args):
super().bind_arguments(args)
if self.enabled and not self.redshift_error_message:
self.redshift_enabled = True
@property
def redshift_enabled(self) -> bool:
return bool(self._redshift_proc)
@property
def redshift_error_message(self):
if self.enabled and not (self.args.redshift_location or self.args.redshift_temperature):
return "Missing parameter(s) --redshift-location and/or --redshift-temperature"
if self._redshift_proc is not None and self._redshift_proc.returncode is not None and self._redshift_proc.returncode != 0:
logger.error("Redshift process died unexpectedly: %s", self._redshift_proc.communicate())
return self._redshift_proc.communicate()[1].replace("\n", ' ')
return None
@redshift_enabled.setter
def redshift_enabled(self, value: bool) -> None:
if value == self.redshift_enabled:
return
if value:
logger.info("Starting redshift: -l %s -t %s", self.args.redshift_location, self.args.redshift_temperature)
self._redshift_proc = subprocess.Popen(
['redshift', '-l', self.args.redshift_location, '-t', self.args.redshift_temperature], stdin=subprocess.DEVNULL, stderr=subprocess.STDOUT)
else:
logger.info("Terminating running redshift process")
self._redshift_proc.terminate()
def periodic(self):
if self._redshift_proc:
self._redshift_proc.poll()
if self._redshift_proc.returncode is not None:
self._redshift_proc = None
return True
def respond_to(self, command):
if command == ':redshift':
8 years ago
self.redshift_enabled = not self.redshift_enabled
return True
return False
def cleanup(self):
self.redshift_enabled = False
if self._redshift_proc:
self._redshift_proc.wait()
def __str__(self):
if not self.redshift_error_message:
return action(self.create_pipe_command(':redshift'), 'R' if self.redshift_enabled else 'r')
8 years ago
return 'E: ' + self.redshift_error_message
def load_state(self, state):
self.redshift_enabled = state['redshift_enabled']
def dump_state(self):
return {'redshift_enabled': self.redshift_enabled}