Mercurial > libervia-backend
view sat_frontends/jp/cmd_info.py @ 3029:457ae6381e2a
doc: replaced deprecated installation link in INSTALL
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 14 Aug 2019 08:08:25 +0200 |
parents | ab2696e34d29 |
children | fee60f17ebac |
line wrap: on
line source
#!/usr/bin/env python2 # -*- coding: utf-8 -*- # jp: a SAT command line tool # Copyright (C) 2009-2019 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 . import base from sat.core.i18n import _ from sat.tools.common.ansi import ANSI as A from sat.tools.common import date_utils from sat_frontends.jp.constants import Const as C from sat_frontends.jp import common __commands__ = ["Info"] class Disco(base.CommandBase): def __init__(self, host): extra_outputs = {'default': self.default_output} super(Disco, self).__init__(host, 'disco', use_output='complex', extra_outputs=extra_outputs, help=_('service discovery')) self.need_loop=True def add_parser_options(self): self.parser.add_argument("jid", help=_("entity to discover")) self.parser.add_argument("-t", "--type", type=str, choices=('infos', 'items', 'both'), default='both', help=_("type of data to discover")) self.parser.add_argument("-n", "--node", default='', help=_("node to use")) self.parser.add_argument("-C", "--no-cache", dest='use_cache', action="store_false", help=_("ignore cache")) def start(self): self.get_infos = self.args.type in ('infos', 'both') self.get_items = self.args.type in ('items', 'both') jids = self.host.check_jids([self.args.jid]) jid = jids[0] if not self.get_infos: self.gotInfos(None, jid) else: self.host.bridge.discoInfos(jid, node=self.args.node, use_cache=self.args.use_cache, profile_key=self.host.profile, callback=lambda infos: self.gotInfos(infos, jid), errback=self.error) def error(self, failure): print((_("Error while doing discovery [%s]") % failure)) self.host.quit(1) def gotInfos(self, infos, jid): if not self.get_items: self.gotItems(infos, None) else: self.host.bridge.discoItems(jid, node=self.args.node, use_cache=self.args.use_cache, profile_key=self.host.profile, callback=lambda items: self.gotItems(infos, items), errback=self.error) def gotItems(self, infos, items): data = {} if self.get_infos: features, identities, extensions = infos features.sort() identities.sort(key=lambda identity: identity[2]) data.update({ 'features': features, 'identities': identities, 'extensions': extensions}) if self.get_items: items.sort(key=lambda item: item[2]) data['items'] = items self.output(data) self.host.quit() def default_output(self, data): features = data.get('features', []) identities = data.get('identities', []) extensions = data.get('extensions', {}) items = data.get('items', []) identities_table = common.Table(self.host, identities, headers=(_('category'), _('type'), _('name')), use_buffer=True) extensions_tpl = [] extensions_types = list(extensions.keys()) extensions_types.sort() for type_ in extensions_types: fields = [] for field in extensions[type_]: field_lines = [] data, values = field data_keys = list(data.keys()) data_keys.sort() for key in data_keys: field_lines.append(A.color('\t', C.A_SUBHEADER, key, A.RESET, ': ', data[key])) if len(values) == 1: field_lines.append(A.color('\t', C.A_SUBHEADER, "value", A.RESET, ': ', values[0] or (A.BOLD + "UNSET"))) elif len(values) > 1: field_lines.append(A.color('\t', C.A_SUBHEADER, "values", A.RESET, ': ')) for value in values: field_lines.append(A.color('\t - ', A.BOLD, value)) fields.append('\n'.join(field_lines)) extensions_tpl.append('{type_}\n{fields}'.format(type_=type_, fields='\n\n'.join(fields))) items_table = common.Table(self.host, items, headers=(_('entity'), _('node'), _('name')), use_buffer=True) template = [] if features: template.append(A.color(C.A_HEADER, _("Features")) + "\n\n{features}") if identities: template.append(A.color(C.A_HEADER, _("Identities")) + "\n\n{identities}") if extensions: template.append(A.color(C.A_HEADER, _("Extensions")) + "\n\n{extensions}") if items: template.append(A.color(C.A_HEADER, _("Items")) + "\n\n{items}") print("\n\n".join(template).format(features = '\n'.join(features), identities = identities_table.display().string, extensions = '\n'.join(extensions_tpl), items = items_table.display().string, )) class Version(base.CommandBase): def __init__(self, host): super(Version, self).__init__(host, 'version', help=_('software version')) self.need_loop=True def add_parser_options(self): self.parser.add_argument("jid", type=str, help=_("Entity to request")) def start(self): jids = self.host.check_jids([self.args.jid]) jid = jids[0] self.host.bridge.getSoftwareVersion(jid, self.host.profile, callback=self.gotVersion, errback=self.error) def error(self, failure): print((_("Error while trying to get version [%s]") % failure)) self.host.quit(1) def gotVersion(self, data): infos = [] name, version, os = data if name: infos.append(_("Software name: %s") % name) if version: infos.append(_("Software version: %s") % version) if os: infos.append(_("Operating System: %s") % os) print("\n".join(infos)) self.host.quit() class Session(base.CommandBase): def __init__(self, host): extra_outputs = {'default': self.default_output} super(Session, self).__init__(host, 'session', use_output='dict', extra_outputs=extra_outputs, help=_('running session')) self.need_loop=True def default_output(self, data): started = data['started'] data['started'] = '{short} (UTC, {relative})'.format( short=date_utils.date_fmt(started), relative=date_utils.date_fmt(started, 'relative')) self.host.output(C.OUTPUT_DICT, 'simple', {}, data) def add_parser_options(self): pass def start(self): self.host.bridge.sessionInfosGet(self.host.profile, callback=self._sessionInfoGetCb, errback=self._sessionInfoGetEb) def _sessionInfoGetCb(self, data): self.output(data) self.host.quit() def _sessionInfoGetEb(self, error_data): self.disp(_('Error getting session infos: {}').format(error_data), error=True) self.host.quit(C.EXIT_BRIDGE_ERRBACK) class Info(base.CommandBase): subcommands = (Disco, Version, Session) def __init__(self, host): super(Info, self).__init__(host, 'info', use_profile=False, help=_('Get various pieces of information on entities'))