Mercurial > libervia-backend
annotate sat_frontends/jp/cmd_profile.py @ 3087:a51f7fce1e2c
tools (stream): data modification on SatFile:
- if `data_cb` is used and if it returns a not None value, it is used instead of the data
read from the file. This allows data modification on the fly, useful notably for
encryption
- new `check_size_with_read` argument which check size on `close()` using amount of data
actually read/written instead of file size. This avoid a warning when file is modified
on the fly
- added `closed` attribute
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 20 Dec 2019 12:28:04 +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')) |