4301
+ − 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" ))