Esempio n. 1
0
class Remote(Module):
    """Remote module - make possible to control OneButton through json-rpc"""

    def __init__(self, **kwargs):
        Module.__init__(self, **kwargs)

        self._server = Server((self._cfg.get('address', ''), self._cfg.get('port', 9000)))

        self._registerHandlers()

        self._server_proc = Thread(target=self._server.serve)
        self._server_proc.daemon = True
        self._server_proc.start()

    def _exec(self, cmd):
        return subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=self._logerr).communicate()[0]

    def _registerHandlers(self):
        functions = self.list()
        for name, f in functions.items():
            log.debug("Remote: add handler for %s - %s" % (f['function'], name))
            self._server.add_handler(getattr(self, name), f['function'])

    def stop(self):
        log.info("Stopping '%s'" % self._cfg.get('name', '[unknown Remote]'))
        self._server.shutdown()

    # Remote jsonrpc functions
    @jsonrpc()
    def version(self):
        return self._control.version()

    @jsonrpc()
    def list(self):
        out = {}
        functions = [getattr(self, f) for f in dir(self) if callable(getattr(self, f)) and hasattr(getattr(self, f), '_jsonrpc')]
        for f in functions:
            name = '%s.%s' % (f._jsonrpc, f.__name__) if f._jsonrpc else f.__name__
            args = [a for a in f.__code__.co_varnames if a != 'self']
            out[f.__name__] = {'function': name, 'arguments': args}
        return out

    @jsonrpc('system')
    def poweroff(self):
        log.info("Remote: poweroff")
        return self._exec(['sudo', 'poweroff'])

    @jsonrpc('system')
    def reboot(self):
        log.info("Remote: reboot")
        return self._exec(['sudo', 'reboot'])

    @jsonrpc('onebutton')
    def upgrade(self, version = None):
        log.info("Remote: upgrade")
        # TODO: command to upgarade
        return version

    @jsonrpc('onebutton')
    def versions(self):
        log.info("Remote: versions")
        # TODO: command to check available versions
        return ['0.1-alpha', '0.2-alpha', '0.3-alpha']

    @jsonrpc('onebutton')
    def restart(self):
        log.info("Remote: restart")
        return self._control.stop()

    @jsonrpc('audio')
    def volumeIn(self, dev = None, left = None, right = None):
        log.info("Remote: volumeIn dev:%s l:%d r:%d" % (dev, left, right))
        # TODO: get & set
        return [0, 0]

    @jsonrpc('audio')
    def volumeOut(self, dev = None, left = None, right = None):
        log.info("Remote: volumeOut dev:%s l:%d r:%d" % (dev, left, right))
        # TODO: get & set
        return [0, 0]