view frontends/src/jp/cmd_disco.py @ 966:9cae72da1b95

jp: added disco subcommand
author Goffi <goffi@goffi.org>
date Tue, 01 Apr 2014 21:16:39 +0200
parents
children
line wrap: on
line source

#! /usr/bin/python
# -*- coding: utf-8 -*-

# jp: a SAT command line tool
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from logging import debug, info, error, warning

import base
from sat.core.i18n import _

__commands__ = ["Disco"]

class Disco(base.CommandBase):

    def __init__(self, host):
        super(Disco, self).__init__(host, 'disco', help=_('Service discovery'))

    def add_parser_options(self):
        self.parser.add_argument("jid", type=str, help=_("Entity to discover"))

    def connected(self):
        super(Disco, self).connected()
        self.need_loop=True
        jids = self.host.check_jids([self.args.jid])
        jid = jids[0]
        self.host.bridge.discoInfos(jid, profile_key=self.host.profile, callback=lambda infos: self.gotInfos(infos, jid), errback=lambda ignore: ignore)

    def gotInfos(self, infos, jid):
        self.host.bridge.discoItems(jid, profile_key=self.host.profile, callback=lambda items: self.gotItems(infos, items), errback=lambda ignore: ignore)

    def gotItems(self, infos, items):
        features, identities = infos
        features.sort()
        identities.sort(key=lambda identity: identity[2])
        items.sort(key=lambda item: item[2])
        identities_lst = []
        items_lst = []
        for identity in identities:
            category, type_, name = identity
            identities_lst.append(u"%(name)s(%(cat)s/%(type)s)" %
                                 {'name': (name+' ') if name else '',
                                  'cat': category,
                                  'type': type_})
        for item in items:
            entity, node_id, name = item
            items_lst.append(u"%(name)s[%(entity)s%(node_id)s]" %
                                 {'name': (name+' ') if name else '',
                                  'entity': entity,
                                  'node_id': (', ' + node_id) if node_id else ''
                                 })

        template = []
        if features:
            template.append(_(u"Features:\n\n%(features)s"))
        if identities:
            template.append(_(u"Identities:\n\n%(identities)s"))
        if items:
            template.append(_(u"Items:\n\n%(items)s"))

        print "\n--\n".join(template) % { 'features': '\n'.join(features),
                                          'identities': '\n'.join(identities_lst),
                                          'items': '\n'.join(items_lst),
                                        }
        self.host.quit()