123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- """
- This module is for the main application logic
- """
- from __future__ import print_function
- import json
- import logging
- import logging.config
- import os
- import signal
- import subprocess
- import sys
- import tempfile
- from time import sleep
- import gevent
- from gevent import monkey
- from gevent.pywsgi import WSGIServer
- from larigira.config import get_conf
- from larigira.mpc import Controller, get_mpd_client
- from larigira.rpc import create_app
- monkey.patch_all(subprocess=True)
- def on_main_crash(*args, **kwargs):
- print('A crash occurred in "main" greenlet. Aborting...')
- sys.exit(1)
- class Larigira(object):
- def __init__(self):
- self.log = logging.getLogger("larigira")
- self.conf = get_conf()
- self.controller = Controller(self.conf)
- self.controller.link_exception(on_main_crash)
- self.http_server = WSGIServer(
- (self.conf["HTTP_ADDRESS"], int(self.conf["HTTP_PORT"])),
- create_app(self.controller.q, self),
- )
- def start(self):
- self.controller.start()
- self.http_server.start()
- def sd_notify(ready=False, status=None):
- args = ["systemd-notify"]
- if ready:
- args.append("--ready")
- if status is not None:
- args.append("--status")
- args.append(status)
- try:
- subprocess.check_call(args)
- except:
- pass
- def main():
- logging.addLevelName(9, "DEBUGV")
- if get_conf()["LOG_CONFIG"]:
- logging.config.fileConfig(
- get_conf()["LOG_CONFIG"], disable_existing_loggers=True
- )
- else:
- log_format = (
- "%(asctime)s|%(levelname)s[%(name)s:%(lineno)d] %(message)s"
- )
- logging.basicConfig(
- level="DEBUGV" if get_conf()["DEBUG"] else logging.INFO,
- format=log_format,
- datefmt="%H:%M:%S",
- )
- def debugv(self, message, *args, **kws):
- if self.isEnabledFor(9):
- self._log(9, message, args, **kws)
- logging.Logger.debugv = debugv
- logging.debug(
- "Starting larigira with this conf:\n%s",
- json.dumps(get_conf(), indent=2),
- )
- if get_conf()["UMASK"]:
- umask = int(get_conf()["UMASK"], base=8)
- logging.debug(
- "Setting umask %s (decimal: %d)", get_conf()["UMASK"], umask
- )
- os.umask(umask)
- tempfile.tempdir = os.environ["TMPDIR"] = os.path.join(
- os.getenv("TMPDIR", "/tmp"), "larigira.%d" % os.getuid()
- )
- if not os.path.isdir(os.environ["TMPDIR"]):
- os.makedirs(os.environ["TMPDIR"])
- if get_conf()["MPD_WAIT_START"]:
- while True:
- try:
- get_mpd_client(get_conf())
- except Exception as exc:
- print("exc", exc, file=sys.stderr)
- logging.debug(
- "Could not connect to MPD at (%s,%s), waiting",
- get_conf()["MPD_HOST"],
- get_conf()["MPD_PORT"],
- )
- sd_notify(status="Waiting MPD connection")
- sleep(int(get_conf()["MPD_WAIT_START_RETRYSECS"]))
- else:
- logging.info("MPD ready!")
- sd_notify(ready=True, status="Ready")
- break
- larigira = Larigira()
- larigira.start()
- def sig(*args):
- print("invoked sig", args)
- larigira.controller.q.put(dict(kind="signal", args=args))
- for signum in (signal.SIGHUP, signal.SIGALRM):
- gevent.signal(signum, sig, signum)
- gevent.wait()
- if __name__ == "__main__":
- main()
|