コード例 #1
0
ファイル: zerorpc_server.py プロジェクト: zboody/chloride
 def subprocess_runner(msg, q):
     from salt.client.api import APIClient
     import json
     SaltClient = APIClient()
     u = SaltClient.verify_token(msg['token'])
     if not u:
         q.put({"error": "Invalid token"})
         return
     resp = SaltClient.runnerClient.cmd(cmdmesg['fun'], cmdmesg['arg'])
     q.put(json.dumps(resp))
コード例 #2
0
ファイル: zerorpc_server.py プロジェクト: zboody/chloride
 def subprocess_cmd(msg, q):
     from salt.client.api import APIClient
     import json
     SaltClient = APIClient()
     u = SaltClient.verify_token(msg['token'])
     if not u:
         q.put({"error": "Invalid token"})
         return
     retval = SaltClient.run(msg)
     echodict = deepcopy(msg)
     echodict.pop('token')
     if msg.get('mode', 'async') == 'async':
         echodict['minions'] = retval['minions']
         echodict['jid'] = retval['jid']
     else:
         echodict['result'] = retval
     echodict['username'] = u['name']
     q.put(json.dumps(echodict))
コード例 #3
0
ファイル: zerorpc_server.py プロジェクト: zboody/chloride
class ZeroServer(object):

    event_listeners = set()
    event_queue = Queue()

    def __init__(self, *args, **kwargs):
        self.SaltClient = APIClient()
        self.event_listener_proc = Process(target=subprocess_read_events, args=(self.event_queue,))
        self.event_listener_proc.start()
        self.event_processor = Greenlet.spawn(process_events, self)
        super(ZeroServer, self).__init__(*args, **kwargs)

    def __del__(self, *args, **kwargs):
        self.event_listener_proc.kill()
        self.event_processor.kill()
        super(ZeroServer, self).__del__(*args, **kwargs)

    def validate_token(self, token):
        r = self.SaltClient.verify_token(token)
        if not r:
            r = {"start": '', "token": token, "expire": '', "name": '', "eauth": '', "valid": False}
        else:
            r['valid'] = True
        return r

    @zerorpc.stream
    def event_stream(self, token):
        v = self.validate_token(token)
        if v.get('valid', False):
            try:
                q = GQueue()
                self.event_listeners.add(q)
                for msg in q:
                    yield msg
            finally:
                self.event_listeners.remove(q)

    def auth(self, username, password, eauth='pam'):
        '''Authenticates a user against external auth and returns a token.'''
        def subprocess_auth(msg, q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            try:
                token = SaltClient.create_token(msg)
            except:
                token = {
                    'error': 'Invalid credentials',
                    'details': 'Authentication failed with provided credentials.'
                }
            q.put(json.dumps(token))

        q = GQueue()
        msg = {
            'username': username,
            'password': password,
            'eauth': eauth
        }
        subprocess_auth(msg, q)
        token = q.get()
        return json.loads(token)

    def cmd(self, cmdmesg):
        def subprocess_cmd(msg, q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            u = SaltClient.verify_token(msg['token'])
            if not u:
                q.put({"error": "Invalid token"})
                return
            retval = SaltClient.run(msg)
            echodict = deepcopy(msg)
            echodict.pop('token')
            if msg.get('mode', 'async') == 'async':
                echodict['minions'] = retval['minions']
                echodict['jid'] = retval['jid']
            else:
                echodict['result'] = retval
            echodict['username'] = u['name']
            q.put(json.dumps(echodict))
        q = GQueue()
        subprocess_cmd(cmdmesg, q)
        retval = q.get()
        return json.loads(retval)

    def runner_sync(self, cmdmesg):
        def subprocess_runner(msg, q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            u = SaltClient.verify_token(msg['token'])
            if not u:
                q.put({"error": "Invalid token"})
                return
            resp = SaltClient.runnerClient.cmd(cmdmesg['fun'], cmdmesg['arg'])
            q.put(json.dumps(resp))
        q = GQueue()
        subprocess_runner(cmdmesg, q)
        retval = q.get()
        return json.loads(retval)

    def signature(self, tgt, module, token):
        cdict = {}
        cdict['tgt'] = tgt
        cdict['module'] = module
        cdict['token'] = token
        j = self.SaltClient.signature(cdict)
        resp = self.get_job(j['jid'])
        while len(resp) == 0:
            sleep(1)
            resp = self.get_job(j['jid'])
        return resp

    def get_minions(self, mid='*'):
        def subprocess_minon(mid, q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            resp = SaltClient.runnerClient.cmd('cache.grains', mid)
            q.put(json.dumps(resp))
        q = GQueue()
        subprocess_minon(mid, q)
        retval = q.get()
        return json.loads(retval)

    def get_job(self, jid):
        def subprocess_job(jid, q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            resp = SaltClient.runnerClient.cmd('jobs.lookup_jid', jid)
            q.put(json.dumps(resp))
        q = GQueue()
        subprocess_job(jid, q)
        retval = q.get()
        return json.loads(retval)

    def get_active(self):
        def subprocess_job(q):
            from salt.client.api import APIClient
            import json
            SaltClient = APIClient()
            resp = SaltClient.runnerClient.cmd('jobs.active')
            q.put(json.dumps(resp))
        q = GQueue()
        subprocess_job(q)
        retval = q.get()
        return json.loads(retval)

    def broadcast_event(self, e):
        for q in self.event_listeners:
            q.put_nowait(json.loads(e))