comparison libervia/cli/cmd_gateway.py @ 4301:9deb3ddb2921

CLI: add commands to handle gateways: rel 449
author Goffi <goffi@goffi.org>
date Fri, 06 Sep 2024 18:03:01 +0200
parents
children
comparison
equal deleted inserted replaced
4300:7ded09452875 4301:9deb3ddb2921
1 #!/usr/bin/env python3
2
3 # Libervia CLI
4 # Copyright (C) 2009-2024 Jérôme Poisson (goffi@goffi.org)
5
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19
20 from libervia.backend.core.i18n import _
21 from libervia.backend.tools.common import data_format
22 from libervia.cli import xmlui_manager
23 from libervia.cli.constants import Const as C
24 from . import base
25 from rich.table import Table
26
27 __commands__ = ["Gateway"]
28
29
30 class List(base.CommandBase):
31 def __init__(self, host):
32 super().__init__(
33 host,
34 "list",
35 use_output=C.OUTPUT_COMPLEX,
36 extra_outputs={"default": self.default_output},
37 use_verbose=True,
38 help=_("list gateways of a server"),
39 )
40
41 def add_parser_options(self):
42 self.parser.add_argument(
43 "server_jid",
44 nargs="?",
45 metavar="JID",
46 default="",
47 help=_("JID of the server to check, use own server if not specified"),
48 )
49
50 def default_output(self, data: dict) -> None:
51 available_table = Table(
52 "JID",
53 _("Name"),
54 _("Category"),
55 _("Type"),
56 title=":white_check_mark: " + _("Available Gateways"),
57 title_justify="left",
58 )
59 for gateway in data["available"]:
60 identities = gateway["identities"]
61 names = "\n".join([identity["name"] for identity in identities])
62 categories = "\n".join([identity["category"] for identity in identities])
63 types = "\n".join([identity["type"] for identity in identities])
64 available_table.add_row(gateway["entity"], names, categories, types)
65
66 self.console.print(available_table)
67
68 if self.verbosity:
69 # In verbose mode, we show unavailable gateways too.
70 self.console.print()
71
72 if self.verbosity > 1:
73 self.console.print(
74 _("Following services are registered but don't answer:"),
75 "\n",
76 style="italic",
77 )
78
79 unavailable_table = Table(
80 "JID",
81 title=":x: " + _("Unavailable Services"),
82 title_justify="left",
83 )
84 for gateway_jid in data["unavailable"]:
85 unavailable_table.add_row(gateway_jid)
86
87 self.console.print(unavailable_table)
88
89 async def start(self):
90 try:
91 found_gateways = data_format.deserialise(
92 await self.host.bridge.gateways_find(self.args.server_jid, self.profile)
93 )
94 except Exception as e:
95 self.disp(f"can't find gateways for {self.args.server_jid}: {e}", error=True)
96 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
97 else:
98 await self.output(found_gateways)
99 self.host.quit(C.EXIT_OK)
100
101
102 class Register(base.CommandBase):
103 def __init__(self, host):
104 super().__init__(
105 host,
106 "register",
107 help=_("register to a gateway"),
108 )
109
110 def add_parser_options(self):
111 self.parser.add_argument(
112 "gateway_jid",
113 metavar="JID",
114 help=_("JID of gateway to register to"),
115 )
116
117 async def start(self):
118 try:
119 xmlui_raw = await self.host.bridge.gateway_register(
120 self.args.gateway_jid, self.profile
121 )
122 except Exception as e:
123 self.disp(f"can't register to gateway: {e}", error=True)
124 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
125 else:
126 xmlui = xmlui_manager.create(self.host, xmlui_raw)
127 await xmlui.show()
128 # FIXME: Registration errors are not correctly managed.
129 ret = await xmlui.submit_form()
130 self.host.quit(C.EXIT_OK)
131
132
133 class Unregister(base.CommandBase):
134 def __init__(self, host):
135 super().__init__(
136 host,
137 "unregister",
138 help=_("unregister from a gateway"),
139 )
140
141 def add_parser_options(self):
142 self.parser.add_argument(
143 "-f",
144 "--force",
145 action="store_true",
146 help=_("unregister without confirmation"),
147 )
148 self.parser.add_argument(
149 "gateway_jid",
150 metavar="JID",
151 help=_("JID of gateway to unregister from"),
152 )
153
154 async def start(self):
155 if not self.args.force:
156 await self.host.confirm_or_quit(
157 _(
158 "Are you sure that you want to unregister from {gateway_jid}?"
159 ).format(gateway_jid=self.args.gateway_jid),
160 _("Gateway unregistration cancelled.")
161 )
162
163 try:
164 await self.host.bridge.in_band_unregister(
165 self.args.gateway_jid, self.profile
166 )
167 except Exception as e:
168 self.disp(f"can't unregister from gateway: {e}", error=True)
169 self.host.quit(C.EXIT_BRIDGE_ERRBACK)
170 else:
171 self.host.quit(C.EXIT_OK)
172
173
174 class Gateway(base.CommandBase):
175 subcommands = (List, Register, Unregister)
176
177 def __init__(self, host):
178 super().__init__(host, "gateway", use_profile=False, help=_("gateway handling"))