clickhouse-users-cli 0.1.3__tar.gz → 0.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/PKG-INFO +1 -1
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/__init__.py +1 -1
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/app.py +28 -14
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/PKG-INFO +1 -1
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/LICENSE +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/README.md +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/db.py +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/session.py +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/sql_builder.py +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/style.py +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/validators.py +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/SOURCES.txt +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/dependency_links.txt +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/entry_points.txt +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/requires.txt +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/top_level.txt +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/pyproject.toml +0 -0
- {clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clickhouse-users-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Keywords: clickhouse,cli,users,access-control,least-privilege
|
|
@@ -106,11 +106,16 @@ def connect_with_retry(conn: ConnectionInfo) -> ClickHouseAdmin:
|
|
|
106
106
|
|
|
107
107
|
# ── Etapa 2: perfil do novo usuário ───────────────────────────────────────────
|
|
108
108
|
|
|
109
|
-
def ask_profile() -> str:
|
|
110
|
-
|
|
109
|
+
def ask_profile(mode: str = "create") -> str:
|
|
110
|
+
if mode == "edit":
|
|
111
|
+
step("Editar · Tipo de acesso", "O perfil redefine os privilégios (os atuais serão zerados).")
|
|
112
|
+
question = "Qual o novo tipo de acesso?"
|
|
113
|
+
else:
|
|
114
|
+
step("2/6 · Tipo de usuário", "O perfil define os privilégios padrão (least privilege primeiro).")
|
|
115
|
+
question = "Que tipo de usuário criar?"
|
|
111
116
|
return _ask_or_abort(
|
|
112
117
|
Q.select(
|
|
113
|
-
|
|
118
|
+
question,
|
|
114
119
|
choices=[Q.Choice(PROFILE_LABELS[k], value=k) for k in ("readonly", "readwrite", "admin", "custom")],
|
|
115
120
|
default="readonly",
|
|
116
121
|
style=APP_STYLE, qmark="›",
|
|
@@ -140,8 +145,11 @@ def ask_new_credentials() -> tuple[str, str]:
|
|
|
140
145
|
|
|
141
146
|
# ── Etapa 4: escopo (bancos → tabelas) ────────────────────────────────────────
|
|
142
147
|
|
|
143
|
-
def ask_databases(admin: ClickHouseAdmin) -> list[str]:
|
|
144
|
-
|
|
148
|
+
def ask_databases(admin: ClickHouseAdmin, mode: str = "create") -> list[str]:
|
|
149
|
+
if mode == "edit":
|
|
150
|
+
step("Editar · Escopo — bancos", "Espaço marca · A confirma · Ctrl+A inverte a seleção.")
|
|
151
|
+
else:
|
|
152
|
+
step("4/6 · Escopo — bancos", "Espaço marca · A confirma · Ctrl+A inverte a seleção.")
|
|
145
153
|
with console.status("[cyan]Listando bancos…[/]", spinner="dots"):
|
|
146
154
|
try:
|
|
147
155
|
databases = admin.list_databases()
|
|
@@ -176,8 +184,11 @@ def ask_databases(admin: ClickHouseAdmin) -> list[str]:
|
|
|
176
184
|
return selected
|
|
177
185
|
|
|
178
186
|
|
|
179
|
-
def ask_tables(admin: ClickHouseAdmin, databases: list[str]) -> list[GrantScope]:
|
|
180
|
-
|
|
187
|
+
def ask_tables(admin: ClickHouseAdmin, databases: list[str], mode: str = "create") -> list[GrantScope]:
|
|
188
|
+
if mode == "edit":
|
|
189
|
+
step("Editar · Escopo — tabelas", "Escolha '*' para o banco inteiro ou marque tabelas específicas.")
|
|
190
|
+
else:
|
|
191
|
+
step("4/6 · Escopo — tabelas", "Escolha '*' para o banco inteiro ou marque tabelas específicas.")
|
|
181
192
|
scopes: list[GrantScope] = []
|
|
182
193
|
for db in databases:
|
|
183
194
|
try:
|
|
@@ -226,13 +237,16 @@ PRIVILEGE_CHOICES = [
|
|
|
226
237
|
]
|
|
227
238
|
|
|
228
239
|
|
|
229
|
-
def ask_privileges(profile: str) -> tuple[list[str], bool]:
|
|
240
|
+
def ask_privileges(profile: str, mode: str = "create") -> tuple[list[str], bool]:
|
|
230
241
|
"""Retorna (privilégios, grant_option)."""
|
|
231
242
|
if profile != "custom":
|
|
232
243
|
grant_option = profile == "admin"
|
|
233
244
|
return list(PROFILE_PRIVILEGES[profile]), grant_option
|
|
234
245
|
|
|
235
|
-
|
|
246
|
+
if mode == "edit":
|
|
247
|
+
step("Editar · Privilégios personalizados", "Marque só o necessário — DROP/TRUNCATE exigem confirmação extra.")
|
|
248
|
+
else:
|
|
249
|
+
step("5/6 · Privilégios personalizados", "Marque só o necessário — DROP/TRUNCATE exigem confirmação extra.")
|
|
236
250
|
privs: list[str] = _ask_or_abort(
|
|
237
251
|
Q.checkbox(
|
|
238
252
|
"Quais privilégios conceder?",
|
|
@@ -247,7 +261,7 @@ def ask_privileges(profile: str) -> tuple[list[str], bool]:
|
|
|
247
261
|
Q.confirm("Você marcou privilégio destrutivo. Tem certeza?", default=False, style=APP_STYLE, qmark="›")
|
|
248
262
|
)
|
|
249
263
|
if not grant_option_confirm:
|
|
250
|
-
return ask_privileges("custom")
|
|
264
|
+
return ask_privileges("custom", mode=mode)
|
|
251
265
|
else:
|
|
252
266
|
grant_option = _ask_or_abort(
|
|
253
267
|
Q.confirm("Permitir repassar acessos (WITH GRANT OPTION)?", default=False, style=APP_STYLE, qmark="›")
|
|
@@ -511,12 +525,12 @@ def flow_edit_grants(admin: ClickHouseAdmin, username: str) -> None:
|
|
|
511
525
|
if username == admin.conn.username:
|
|
512
526
|
warn(f"'{username}' é o usuário conectado agora. Zerar os próprios acessos pode te derrubar.")
|
|
513
527
|
|
|
514
|
-
profile = ask_profile()
|
|
515
|
-
privileges, grant_option = ask_privileges(profile)
|
|
528
|
+
profile = ask_profile(mode="edit")
|
|
529
|
+
privileges, grant_option = ask_privileges(profile, mode="edit")
|
|
516
530
|
if profile == "admin":
|
|
517
531
|
grant_option = True
|
|
518
|
-
databases = ask_databases(admin)
|
|
519
|
-
scopes = ask_tables(admin, databases)
|
|
532
|
+
databases = ask_databases(admin, mode="edit")
|
|
533
|
+
scopes = ask_tables(admin, databases, mode="edit")
|
|
520
534
|
|
|
521
535
|
statements = build_edit_grants_statements(username, privileges, scopes, grant_option)
|
|
522
536
|
table = make_table(f"Novos acessos de '{username}'")
|
{clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clickhouse-users-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: CLI interativa para criar usuarios ClickHouse com privilegio minimo (least privilege)
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Keywords: clickhouse,cli,users,access-control,least-privilege
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/sql_builder.py
RENAMED
|
File without changes
|
|
File without changes
|
{clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli/validators.py
RENAMED
|
File without changes
|
{clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clickhouse_users_cli-0.1.3 → clickhouse_users_cli-0.1.4}/clickhouse_users_cli.egg-info/requires.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|