Mercurial > libervia-backend
annotate sat_frontends/jp/cmd_profile.py @ 3101:ab7e8ade848a
plugin XEP-0045: added room statuses to metadata:
room statuses are now sent with other metadata on bridge signals, and saved in Room
instance. They give useful data on the room, for instance they can be used to know if a
full jid is used in this room.
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 30 Dec 2019 20:44:02 +0100 |
parents | fee60f17ebac |
children | 4486d72658b9 |
rev | line source |
---|---|
1960 | 1 #!/usr/bin/env python2 |
815 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # jp: a SAT command line tool | |
2771 | 5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org) |
815 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
814 | 20 """This module permits to manage profiles. It can list, create, delete |
1199 | 21 and retrieve information about a profile.""" |
0 | 22 |
2492
fcf0ae8102b8
jp (profile/create): errback handling
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
23 from sat_frontends.jp.constants import Const as C |
2164
63d191c05ecd
jp (blog): set default template and data mapping for the new template output
Goffi <goffi@goffi.org>
parents:
2146
diff
changeset
|
24 from sat.core.log import getLogger |
63d191c05ecd
jp (blog): set default template and data mapping for the new template output
Goffi <goffi@goffi.org>
parents:
2146
diff
changeset
|
25 log = getLogger(__name__) |
771 | 26 from sat.core.i18n import _ |
817 | 27 from sat_frontends.jp import base |
402
f03688bdb858
jp: use with statement to open fifo
Goffi <goffi@goffi.org>
parents:
401
diff
changeset
|
28 |
817 | 29 __commands__ = ["Profile"] |
30 | |
31 PROFILE_HELP = _('The name of the profile') | |
0 | 32 |
33 | |
1597 | 34 class ProfileConnect(base.CommandBase): |
35 """Dummy command to use profile_session parent, i.e. to be able to connect without doing anything else""" | |
36 | |
37 def __init__(self, host): | |
38 # it's weird to have a command named "connect" with need_connect=False, but it can be handy to be able | |
2336
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
39 # to launch just the session, so some paradoxes don't hurt |
3028 | 40 super(ProfileConnect, self).__init__(host, 'connect', need_connect=False, help=('connect a profile')) |
1597 | 41 |
42 def add_parser_options(self): | |
43 pass | |
44 | |
3040 | 45 async def start(self): |
46 # connection is already managed by profile common commands | |
47 # so we just need to check arguments and quit | |
48 if not self.args.connect and not self.args.start_session: | |
49 self.parser.error(_("You need to use either --connect or --start-session")) | |
50 self.host.quit() | |
1597 | 51 |
2336
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
52 class ProfileDisconnect(base.CommandBase): |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
53 |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
54 def __init__(self, host): |
3028 | 55 super(ProfileDisconnect, self).__init__(host, 'disconnect', need_connect=False, help=('disconnect a profile')) |
2336
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
56 |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
57 def add_parser_options(self): |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
58 pass |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
59 |
3040 | 60 async def start(self): |
61 try: | |
62 await self.host.bridge.disconnect(self.args.profile) | |
63 except Exception as e: | |
64 self.disp(f"can't disconnect profile: {e}", error=True) | |
65 self.host.quit(C.EXIT_BRIDGE_ERRBACK) | |
66 else: | |
67 self.host.quit() | |
68 | |
69 | |
70 class ProfileCreate(base.CommandBase): | |
71 def __init__(self, host): | |
72 super(ProfileCreate, self).__init__(host, 'create', use_profile=False, help=('create a new profile')) | |
73 | |
74 def add_parser_options(self): | |
75 self.parser.add_argument('profile', type=str, help=_('the name of the profile')) | |
76 self.parser.add_argument('-p', '--password', type=str, default='', help=_('the password of the profile')) | |
77 self.parser.add_argument('-j', '--jid', type=str, help=_('the jid of the profile')) | |
78 self.parser.add_argument('-x', '--xmpp-password', type=str, help=_('the password of the XMPP account (use profile password if not specified)'), | |
79 metavar='PASSWORD') | |
80 self.parser.add_argument('-C', '--component', default='', | |
81 help=_('set to component import name (entry point) if this is a component')) | |
82 | |
83 async def start(self): | |
84 """Create a new profile""" | |
85 if self.args.profile in await self.host.bridge.profilesListGet(): | |
86 self.disp(f"Profile {self.args.profile} already exists.", error=True) | |
87 self.host.quit(C.EXIT_BRIDGE_ERROR) | |
88 try: | |
89 await self.host.bridge.profileCreate( | |
90 self.args.profile, self.args.password, self.args.component) | |
91 except Exception as e: | |
92 self.disp(f"can't create profile: {e}", error=True) | |
93 self.host.quit(C.EXIT_BRIDGE_ERRBACK) | |
94 | |
95 try: | |
96 await self.host.bridge.profileStartSession( | |
97 self.args.password, self.args.profile) | |
98 except Exception as e: | |
99 self.disp(f"can't start profile session: {e}", error=True) | |
100 self.host.quit(C.EXIT_BRIDGE_ERRBACK) | |
101 | |
102 if self.args.jid: | |
103 await self.host.bridge.setParam( | |
104 "JabberID", self.args.jid, "Connection", profile_key=self.args.profile) | |
105 xmpp_pwd = self.args.password or self.args.xmpp_password | |
106 if xmpp_pwd: | |
107 await self.host.bridge.setParam( | |
108 "Password", xmpp_pwd, "Connection", profile_key=self.args.profile) | |
109 | |
110 self.disp(f'profile {self.args.profile} created successfully', 1) | |
111 self.host.quit() | |
2336
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
112 |
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
113 |
1596 | 114 class ProfileDefault(base.CommandBase): |
115 def __init__(self, host): | |
3028 | 116 super(ProfileDefault, self).__init__(host, 'default', use_profile=False, help=('print default profile')) |
1596 | 117 |
118 def add_parser_options(self): | |
119 pass | |
120 | |
3040 | 121 async def start(self): |
122 print(await self.host.bridge.profileNameGet('@DEFAULT@')) | |
123 self.host.quit() | |
1596 | 124 |
125 | |
817 | 126 class ProfileDelete(base.CommandBase): |
127 def __init__(self, host): | |
3028 | 128 super(ProfileDelete, self).__init__(host, 'delete', use_profile=False, help=('delete a profile')) |
817 | 129 |
130 def add_parser_options(self): | |
131 self.parser.add_argument('profile', type=str, help=PROFILE_HELP) | |
3028 | 132 self.parser.add_argument('-f', '--force', action='store_true', help=_('delete profile without confirmation')) |
0 | 133 |
3040 | 134 async def start(self): |
135 if self.args.profile not in await self.host.bridge.profilesListGet(): | |
136 log.error(f"Profile {self.args.profile} doesn't exist.") | |
137 self.host.quit(C.EXIT_NOT_FOUND) | |
1861
3b2a236fa743
jp (profile): added confirmation and --force arguement to profile/delete
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
138 if not self.args.force: |
3040 | 139 message = f"Are you sure to delete profile [{self.args.profile}] ?" |
140 cancel_message = "Profile deletion cancelled" | |
141 await self.host.confirmOrQuit(message, cancel_message) | |
1861
3b2a236fa743
jp (profile): added confirmation and --force arguement to profile/delete
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
142 |
3040 | 143 await self.host.bridge.asyncDeleteProfile(self.args.profile) |
144 self.host.quit() | |
817 | 145 |
0 | 146 |
817 | 147 class ProfileInfo(base.CommandBase): |
148 def __init__(self, host): | |
3028 | 149 super(ProfileInfo, self).__init__(host, 'info', need_connect=False, help=_('get information about a profile')) |
150 self.to_show = [(_("jid"), "Connection", "JabberID"),] | |
1402
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
151 self.largest = max([len(item[0]) for item in self.to_show]) |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
152 |
817 | 153 def add_parser_options(self): |
3028 | 154 self.parser.add_argument('--show-password', action='store_true', help=_('show the XMPP password IN CLEAR TEXT')) |
814 | 155 |
3040 | 156 async def showNextValue(self, label=None, category=None, value=None): |
1402
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
157 """Show next value from self.to_show and quit on last one""" |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
158 if label is not None: |
3040 | 159 print((("{label:<"+str(self.largest+2)+"}{value}").format( |
160 label=label+": ", value=value))) | |
1402
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
161 try: |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
162 label, category, name = self.to_show.pop(0) |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
163 except IndexError: |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
164 self.host.quit() |
391b0c21f4be
jp (profile): fixed "profile info" to use profile, and then manage connection.
Goffi <goffi@goffi.org>
parents:
1396
diff
changeset
|
165 else: |
3040 | 166 try: |
167 value = await self.host.bridge.asyncGetParamA( | |
168 name, category, profile_key=self.host.profile) | |
169 except Exception as e: | |
170 self.disp(f"can't get {name}/{category} param: {e}", error=True) | |
171 self.host.quit(C.EXIT_BRIDGE_ERRBACK) | |
172 else: | |
173 await self.showNextValue(label, category, value) | |
814 | 174 |
3040 | 175 async def start(self): |
1596 | 176 if self.args.show_password: |
3028 | 177 self.to_show.append((_("XMPP password"), "Connection", "Password")) |
3040 | 178 await self.showNextValue() |
817 | 179 |
180 | |
181 class ProfileList(base.CommandBase): | |
182 def __init__(self, host): | |
3028 | 183 super(ProfileList, self).__init__(host, 'list', use_profile=False, use_output='list', help=('list profiles')) |
657 | 184 |
817 | 185 def add_parser_options(self): |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
186 group = self.parser.add_mutually_exclusive_group() |
3028 | 187 group.add_argument('-c', '--clients', action='store_true', help=_('get clients profiles only')) |
188 group.add_argument('-C', '--components', action='store_true', help=('get components profiles only')) | |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
189 |
817 | 190 |
3040 | 191 async def start(self): |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
192 if self.args.clients: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
193 clients, components = True, False |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
194 elif self.args.components: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
195 clients, components = False, True |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
196 else: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
197 clients, components = True, True |
3040 | 198 await self.output(await self.host.bridge.profilesListGet(clients, components)) |
817 | 199 self.host.quit() |
657 | 200 |
817 | 201 |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
202 class ProfileModify(base.CommandBase): |
3040 | 203 |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
204 def __init__(self, host): |
3028 | 205 super(ProfileModify, self).__init__(host, 'modify', need_connect=False, help=_('modify an existing profile')) |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
206 |
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
207 def add_parser_options(self): |
1687
de9cc4d62a4a
jp (profile): fixed profile/modify command:
Goffi <goffi@goffi.org>
parents:
1597
diff
changeset
|
208 profile_pwd_group = self.parser.add_mutually_exclusive_group() |
3028 | 209 profile_pwd_group.add_argument('-w', '--password', help=_('change the password of the profile')) |
210 profile_pwd_group.add_argument('--disable-password', action='store_true', help=_('disable profile password (dangerous!)')) | |
211 self.parser.add_argument('-j', '--jid', help=_('the jid of the profile')) | |
212 self.parser.add_argument('-x', '--xmpp-password', help=_('change the password of the XMPP account'), | |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
213 metavar='PASSWORD') |
3028 | 214 self.parser.add_argument('-D', '--default', action='store_true', help=_('set as default profile')) |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
215 |
3040 | 216 async def start(self): |
1687
de9cc4d62a4a
jp (profile): fixed profile/modify command:
Goffi <goffi@goffi.org>
parents:
1597
diff
changeset
|
217 if self.args.disable_password: |
de9cc4d62a4a
jp (profile): fixed profile/modify command:
Goffi <goffi@goffi.org>
parents:
1597
diff
changeset
|
218 self.args.password = '' |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
219 if self.args.password is not None: |
3040 | 220 await self.host.bridge.setParam( |
221 "Password", self.args.password, "General", profile_key=self.host.profile) | |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
222 if self.args.jid is not None: |
3040 | 223 await self.host.bridge.setParam( |
224 "JabberID", self.args.jid, "Connection", profile_key=self.host.profile) | |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
225 if self.args.xmpp_password is not None: |
3040 | 226 await self.host.bridge.setParam( |
227 "Password", self.args.xmpp_password, "Connection", profile_key=self.host.profile) | |
1596 | 228 if self.args.default: |
3040 | 229 await self.host.bridge.profileSetDefault(self.host.profile) |
230 | |
231 self.host.quit() | |
1404
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
232 |
e4e960d285b0
jp (profile): added "profile modify" command
Goffi <goffi@goffi.org>
parents:
1403
diff
changeset
|
233 |
817 | 234 class Profile(base.CommandBase): |
2336
a7438fe4e24d
jp (profile): added disconnect command
Goffi <goffi@goffi.org>
parents:
2221
diff
changeset
|
235 subcommands = (ProfileConnect, ProfileDisconnect, ProfileCreate, ProfileDefault, ProfileDelete, ProfileInfo, ProfileList, ProfileModify) |
817 | 236 |
237 def __init__(self, host): | |
3028 | 238 super(Profile, self).__init__(host, 'profile', use_profile=False, help=_('profile commands')) |