kaqing 2.0.145__py3-none-any.whl → 2.0.189__py3-none-any.whl
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.
Potentially problematic release.
This version of kaqing might be problematic. Click here for more details.
- adam/__init__.py +0 -2
- adam/app_session.py +9 -12
- adam/apps.py +18 -4
- adam/batch.py +4 -4
- adam/checks/check_utils.py +16 -46
- adam/checks/cpu.py +7 -1
- adam/checks/cpu_metrics.py +52 -0
- adam/checks/disk.py +2 -3
- adam/columns/columns.py +3 -1
- adam/columns/cpu.py +3 -1
- adam/columns/cpu_metrics.py +22 -0
- adam/columns/memory.py +3 -4
- adam/commands/__init__.py +24 -0
- adam/commands/alter_tables.py +33 -48
- adam/commands/app/__init__.py +0 -0
- adam/commands/app/app.py +38 -0
- adam/commands/{app_ping.py → app/app_ping.py} +7 -13
- adam/commands/app/show_app_actions.py +49 -0
- adam/commands/{show → app}/show_app_id.py +8 -11
- adam/commands/{show → app}/show_app_queues.py +7 -14
- adam/commands/app/utils_app.py +106 -0
- adam/commands/audit/audit.py +21 -40
- adam/commands/audit/audit_repair_tables.py +14 -19
- adam/commands/audit/audit_run.py +14 -22
- adam/commands/audit/completions_l.py +15 -0
- adam/commands/audit/show_last10.py +4 -19
- adam/commands/audit/show_slow10.py +4 -18
- adam/commands/audit/show_top10.py +4 -16
- adam/commands/audit/utils_show_top10.py +15 -3
- adam/commands/bash/__init__.py +5 -0
- adam/commands/bash/bash.py +7 -104
- adam/commands/bash/utils_bash.py +16 -0
- adam/commands/cat.py +7 -27
- adam/commands/cd.py +7 -11
- adam/commands/check.py +15 -24
- adam/commands/cli_commands.py +8 -4
- adam/commands/clipboard_copy.py +87 -0
- adam/commands/code.py +21 -24
- adam/commands/command.py +207 -42
- adam/commands/commands_utils.py +25 -27
- adam/commands/cql/completions_c.py +28 -0
- adam/commands/cql/cqlsh.py +9 -33
- adam/commands/cql/{cql_utils.py → utils_cql.py} +111 -15
- adam/commands/deploy/code_start.py +7 -10
- adam/commands/deploy/code_stop.py +4 -21
- adam/commands/deploy/code_utils.py +3 -3
- adam/commands/deploy/deploy.py +4 -27
- adam/commands/deploy/deploy_frontend.py +14 -17
- adam/commands/deploy/deploy_pg_agent.py +3 -6
- adam/commands/deploy/deploy_pod.py +64 -68
- adam/commands/deploy/undeploy.py +4 -27
- adam/commands/deploy/undeploy_frontend.py +4 -7
- adam/commands/deploy/undeploy_pg_agent.py +5 -8
- adam/commands/deploy/undeploy_pod.py +9 -12
- adam/commands/devices/device.py +124 -2
- adam/commands/devices/device_app.py +41 -24
- adam/commands/devices/device_auit_log.py +10 -4
- adam/commands/devices/device_cass.py +48 -14
- adam/commands/devices/device_export.py +13 -12
- adam/commands/devices/device_postgres.py +105 -54
- adam/commands/download_file.py +47 -0
- adam/commands/exit.py +1 -4
- adam/commands/export/clean_up_all_export_sessions.py +37 -0
- adam/commands/export/clean_up_export_sessions.py +9 -10
- adam/commands/export/completions_x.py +11 -0
- adam/commands/export/download_export_session.py +40 -0
- adam/commands/export/drop_export_database.py +7 -26
- adam/commands/export/drop_export_databases.py +5 -14
- adam/commands/export/export.py +6 -52
- adam/commands/export/export_databases.py +108 -32
- adam/commands/export/export_select.py +8 -59
- adam/commands/export/export_sessions.py +209 -0
- adam/commands/export/export_use.py +14 -20
- adam/commands/export/export_x_select.py +48 -0
- adam/commands/export/exporter.py +135 -167
- adam/commands/export/import_files.py +44 -0
- adam/commands/export/import_session.py +11 -35
- adam/commands/export/importer.py +19 -5
- adam/commands/export/importer_athena.py +112 -44
- adam/commands/export/importer_sqlite.py +42 -22
- adam/commands/export/show_column_counts.py +13 -31
- adam/commands/export/show_export_databases.py +7 -7
- adam/commands/export/show_export_session.py +8 -20
- adam/commands/export/show_export_sessions.py +6 -16
- adam/commands/export/utils_export.py +64 -11
- adam/commands/find_files.py +51 -0
- adam/commands/find_processes.py +76 -0
- adam/commands/head.py +36 -0
- adam/commands/help.py +2 -2
- adam/commands/intermediate_command.py +52 -0
- adam/commands/issues.py +11 -43
- adam/commands/kubectl.py +3 -6
- adam/commands/login.py +22 -24
- adam/commands/logs.py +3 -6
- adam/commands/ls.py +9 -10
- adam/commands/medusa/medusa.py +4 -22
- adam/commands/medusa/medusa_backup.py +20 -27
- adam/commands/medusa/medusa_restore.py +49 -46
- adam/commands/medusa/medusa_show_backupjobs.py +16 -18
- adam/commands/medusa/medusa_show_restorejobs.py +13 -18
- adam/commands/medusa/utils_medusa.py +15 -0
- adam/commands/nodetool.py +7 -21
- adam/commands/param_get.py +11 -14
- adam/commands/param_set.py +8 -12
- adam/commands/postgres/completions_p.py +22 -0
- adam/commands/postgres/postgres.py +34 -57
- adam/commands/postgres/postgres_databases.py +270 -0
- adam/commands/postgres/postgres_ls.py +4 -8
- adam/commands/postgres/postgres_preview.py +5 -9
- adam/commands/postgres/utils_postgres.py +79 -0
- adam/commands/preview_table.py +8 -45
- adam/commands/pwd.py +13 -16
- adam/commands/reaper/reaper.py +4 -27
- adam/commands/reaper/reaper_forward.py +49 -56
- adam/commands/reaper/reaper_forward_session.py +6 -0
- adam/commands/reaper/reaper_forward_stop.py +10 -16
- adam/commands/reaper/reaper_restart.py +7 -14
- adam/commands/reaper/reaper_run_abort.py +8 -33
- adam/commands/reaper/reaper_runs.py +43 -58
- adam/commands/reaper/reaper_runs_abort.py +29 -49
- adam/commands/reaper/reaper_schedule_activate.py +14 -33
- adam/commands/reaper/reaper_schedule_start.py +9 -33
- adam/commands/reaper/reaper_schedule_stop.py +9 -33
- adam/commands/reaper/reaper_schedules.py +4 -14
- adam/commands/reaper/reaper_status.py +8 -16
- adam/commands/reaper/utils_reaper.py +203 -0
- adam/commands/repair/repair.py +4 -22
- adam/commands/repair/repair_log.py +5 -11
- adam/commands/repair/repair_run.py +27 -34
- adam/commands/repair/repair_scan.py +32 -40
- adam/commands/repair/repair_stop.py +5 -12
- adam/commands/report.py +27 -29
- adam/commands/restart.py +25 -26
- adam/commands/rollout.py +19 -24
- adam/commands/shell.py +12 -4
- adam/commands/show/show.py +11 -27
- adam/commands/show/show_adam.py +3 -3
- adam/commands/show/show_cassandra_repairs.py +37 -0
- adam/commands/show/show_cassandra_status.py +47 -51
- adam/commands/show/show_cassandra_version.py +5 -18
- adam/commands/show/show_cli_commands.py +56 -0
- adam/commands/show/show_host.py +1 -1
- adam/commands/show/show_login.py +20 -27
- adam/commands/show/show_params.py +2 -5
- adam/commands/show/show_processes.py +18 -21
- adam/commands/show/show_storage.py +11 -20
- adam/commands/watch.py +26 -29
- adam/config.py +5 -16
- adam/embedded_params.py +1 -1
- adam/log.py +4 -4
- adam/pod_exec_result.py +3 -3
- adam/repl.py +45 -39
- adam/repl_commands.py +26 -19
- adam/repl_session.py +8 -1
- adam/repl_state.py +85 -36
- adam/sql/lark_completer.py +284 -0
- adam/sql/lark_parser.py +604 -0
- adam/sql/sql_completer.py +4 -6
- adam/sql/sql_state_machine.py +29 -16
- adam/sso/authn_ad.py +6 -8
- adam/sso/authn_okta.py +4 -6
- adam/sso/cred_cache.py +3 -5
- adam/sso/idp.py +9 -12
- adam/utils.py +484 -37
- adam/utils_athena.py +19 -19
- adam/utils_audits.py +12 -12
- adam/utils_issues.py +32 -0
- adam/utils_k8s/app_clusters.py +14 -19
- adam/utils_k8s/app_pods.py +7 -2
- adam/utils_k8s/cassandra_clusters.py +30 -19
- adam/utils_k8s/cassandra_nodes.py +2 -2
- adam/utils_k8s/custom_resources.py +16 -17
- adam/utils_k8s/ingresses.py +2 -2
- adam/utils_k8s/jobs.py +7 -11
- adam/utils_k8s/k8s.py +96 -0
- adam/utils_k8s/kube_context.py +2 -2
- adam/utils_k8s/pods.py +37 -81
- adam/utils_k8s/secrets.py +4 -4
- adam/utils_k8s/service_accounts.py +5 -4
- adam/utils_k8s/services.py +2 -2
- adam/utils_k8s/statefulsets.py +6 -14
- adam/utils_local.py +4 -0
- adam/utils_repl/appendable_completer.py +6 -0
- adam/utils_repl/repl_completer.py +128 -2
- adam/utils_repl/state_machine.py +3 -3
- adam/utils_sqlite.py +78 -42
- adam/version.py +1 -1
- {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/METADATA +1 -1
- kaqing-2.0.189.dist-info/RECORD +253 -0
- kaqing-2.0.189.dist-info/top_level.txt +2 -0
- teddy/__init__.py +0 -0
- teddy/lark_parser.py +436 -0
- teddy/lark_parser2.py +618 -0
- adam/commands/app.py +0 -67
- adam/commands/cp.py +0 -95
- adam/commands/cql/cql_completions.py +0 -28
- adam/commands/export/clean_up_export_session.py +0 -53
- adam/commands/export/export_select_x.py +0 -54
- adam/commands/postgres/postgres_context.py +0 -248
- adam/commands/postgres/postgres_utils.py +0 -31
- adam/commands/postgres/psql_completions.py +0 -10
- adam/commands/reaper/reaper_session.py +0 -159
- adam/commands/show/show_app_actions.py +0 -56
- adam/commands/show/show_commands.py +0 -61
- adam/commands/show/show_repairs.py +0 -47
- kaqing-2.0.145.dist-info/RECORD +0 -227
- kaqing-2.0.145.dist-info/top_level.txt +0 -1
- {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/WHEEL +0 -0
- {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/entry_points.txt +0 -0
adam/sql/sql_state_machine.py
CHANGED
|
@@ -2,6 +2,7 @@ from typing import Callable
|
|
|
2
2
|
from sqlparse.sql import Token
|
|
3
3
|
from sqlparse import tokens as TOKEN
|
|
4
4
|
|
|
5
|
+
from adam.utils import log_exc
|
|
5
6
|
from adam.utils_repl.state_machine import StateMachine, State
|
|
6
7
|
|
|
7
8
|
__all__ = [
|
|
@@ -76,8 +77,8 @@ SQL_SPEC = [
|
|
|
76
77
|
'- > ; > ',
|
|
77
78
|
'select_from_sq_ > as > select_from_x_as ^ as',
|
|
78
79
|
'select_from_x_comma_ > name|audit > select_from_x ^ tables',
|
|
79
|
-
'select_from_x_ ^ as,where,inner join,left outer join,right outer join,full outer join,group by,order by,limit',
|
|
80
|
-
'select_from_x_as_x_ > , > select_from_x_comma_ ^ where,inner join,left outer join,right outer join,full outer join,group by,order by,limit',
|
|
80
|
+
'select_from_x_ ^ as,where,inner join,left outer join,right outer join,full outer join,group by,order by,limit,&',
|
|
81
|
+
'select_from_x_as_x_ > , > select_from_x_comma_ ^ where,inner join,left outer join,right outer join,full outer join,group by,order by,limit,&',
|
|
81
82
|
'- > as > select_from_x_as',
|
|
82
83
|
'- > where > select_where',
|
|
83
84
|
'- > order > select_order',
|
|
@@ -96,6 +97,7 @@ SQL_SPEC = [
|
|
|
96
97
|
'- > full > select_from_x_full',
|
|
97
98
|
'- > full outer join > select_join',
|
|
98
99
|
'- > ; > ',
|
|
100
|
+
'- > & > select_from_x$',
|
|
99
101
|
'select_from_x_as_ > name > select_from_x_as_x ^ x,y,z',
|
|
100
102
|
'select_from_x_as_x > , > select_from_x_as_x_comma_',
|
|
101
103
|
'- > ; > ',
|
|
@@ -118,34 +120,38 @@ SQL_SPEC = [
|
|
|
118
120
|
'select_where_a_not_op > name|single|num > select_where_sc ^ single',
|
|
119
121
|
'select_where_a_op > name|single|num > select_where_sc ^ single',
|
|
120
122
|
'select_where_sc > ; > ',
|
|
121
|
-
'select_where_sc_ > and|or > select_where ^ and,or,order by,group by,limit',
|
|
123
|
+
'select_where_sc_ > and|or > select_where ^ and,or,order by,group by,limit,&',
|
|
122
124
|
'- > group > select_group',
|
|
123
125
|
'- > group by > select_group_by',
|
|
124
126
|
'- > order > select_order',
|
|
125
127
|
'- > order by > select_order_by',
|
|
126
128
|
'- > limit > select_where_sc_limit',
|
|
127
129
|
'- > ; > ',
|
|
130
|
+
'- > & > select_from_x$',
|
|
128
131
|
'select_group_ > by > select_group_by ^ by',
|
|
129
132
|
'select_group_by_ > name > select_group_by_a ^ columns',
|
|
130
133
|
'select_group_by_a > , > select_group_by_a_comma_ ^ columns',
|
|
131
134
|
'- > ; > ',
|
|
132
135
|
'select_group_by_a_comma_ > name > select_group_by_a ^ columns',
|
|
133
|
-
'select_group_by_a_ > limit > select_where_sc_limit ^ limit,order by',
|
|
136
|
+
'select_group_by_a_ > limit > select_where_sc_limit ^ limit,order by,&',
|
|
134
137
|
'- > order > select_order',
|
|
135
138
|
'- > order by > select_order_by',
|
|
136
139
|
'- > ; > ',
|
|
140
|
+
'- > & > select_from_x$',
|
|
137
141
|
'select_order_ > by > select_order_by ^ by',
|
|
138
142
|
'select_order_by_ > name > select_order_by_a ^ columns',
|
|
139
143
|
'select_order_by_a > , > select_order_by_a_comma_',
|
|
140
144
|
'- > ; > ',
|
|
141
145
|
'select_order_by_a_comma_ > name > select_order_by_a ^ columns',
|
|
142
|
-
'select_order_by_a_ > desc|asc > select_order_by_a_desc ^ desc,asc,limit',
|
|
146
|
+
'select_order_by_a_ > desc|asc > select_order_by_a_desc ^ desc,asc,limit,&',
|
|
143
147
|
'- > limit > select_where_sc_limit',
|
|
144
148
|
'- > ; > ',
|
|
149
|
+
'- > & > select_from_x$',
|
|
145
150
|
'select_order_by_a_desc > , > select_order_by_a_comma_',
|
|
146
151
|
'- > ; > ',
|
|
147
|
-
'select_order_by_a_desc_ > limit > select_where_sc_limit ^ limit',
|
|
152
|
+
'select_order_by_a_desc_ > limit > select_where_sc_limit ^ limit,&',
|
|
148
153
|
'- > ; > ',
|
|
154
|
+
'- > & > select_from_x$',
|
|
149
155
|
'select_where_sc_limit_ > num > select_where_sc_limit_num ^ 1',
|
|
150
156
|
'select_where_sc_limit_num > ; > ',
|
|
151
157
|
'select_where_sc_limit_num_rp__ > as > select_from_x_as ^ as',
|
|
@@ -201,7 +207,9 @@ SQL_SPEC = [
|
|
|
201
207
|
'insert_values > ( > insert_values_lp_',
|
|
202
208
|
'insert_values_lp_ > name|single|num > insert_values_lp_v ^ single',
|
|
203
209
|
'insert_values_lp_v > , > insert_values_lp_v_comma_',
|
|
210
|
+
'- > ) > insert_values_lp_v_rp_',
|
|
204
211
|
'insert_values_lp_v_comma_ > name|single|num > insert_values_lp_v',
|
|
212
|
+
'insert_values_lp_v_rp__ > & > insert_values_lp_v_rp_$ ^ &',
|
|
205
213
|
|
|
206
214
|
# <update_statement> ::= UPDATE <table_name>
|
|
207
215
|
# SET <set_clause_list>
|
|
@@ -222,8 +230,9 @@ SQL_SPEC = [
|
|
|
222
230
|
'update_set_a_op > name|single|num > update_set_sc ^ single',
|
|
223
231
|
'update_set_sc > , > update_set_sc_comma_',
|
|
224
232
|
'update_set_sc_comma_ > name > update_set_a ^ id',
|
|
225
|
-
'update_set_sc_ > , > update_set_sc_comma_ ^ where',
|
|
233
|
+
'update_set_sc_ > , > update_set_sc_comma_ ^ where,&',
|
|
226
234
|
'- > where > update_where',
|
|
235
|
+
'- > & > update_set_sc$ ^ &',
|
|
227
236
|
'update_where_ > name > update_where_a ^ id',
|
|
228
237
|
'update_where_a > comparison > update_where_a_op',
|
|
229
238
|
'update_where_a_ > comparison > update_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
|
|
@@ -240,7 +249,7 @@ SQL_SPEC = [
|
|
|
240
249
|
'update_where_a_in_lp_a_comma_ > name|single|num > update_where_a_in_lp_a ^ single',
|
|
241
250
|
'update_where_a_not_op > name|single|num > update_where_sc ^ single',
|
|
242
251
|
'update_where_a_op > name|single|num > update_where_sc ^ single',
|
|
243
|
-
'update_where_sc_ > and|or > update_where ^ and,or',
|
|
252
|
+
'update_where_sc_ > and|or > update_where ^ and,or,&',
|
|
244
253
|
|
|
245
254
|
# <delete_statement> ::= DELETE FROM <table_name> [ WHERE <search_condition> ]
|
|
246
255
|
|
|
@@ -402,9 +411,15 @@ CQL_SPEC = SQL_SPEC + [
|
|
|
402
411
|
'export_table_to_ > athena|sqlite|csv > export_table_to$ ^ athena,sqlite,csv',
|
|
403
412
|
|
|
404
413
|
' > import > import',
|
|
405
|
-
'import_ > session > import_session ^ session',
|
|
414
|
+
'import_ > session > import_session ^ session,files',
|
|
415
|
+
'- > files > import_files',
|
|
406
416
|
'import_session_ > name > import_session_s ^ export-sessions-incomplete',
|
|
407
417
|
'import_session_s_ > to > import_session_to ^ to',
|
|
418
|
+
'import_files_ > name > import_files_f',
|
|
419
|
+
'import_files_f > , > import_files',
|
|
420
|
+
'import_files_f_ > as > import_files_f_as ^ as',
|
|
421
|
+
'import_files_f_as_ > name > import_files_f_as_a',
|
|
422
|
+
'import_files_f_as_a_ > to > import_session_to ^ to',
|
|
408
423
|
'import_session_to_ > athena|sqlite > import_session_to$ ^ athena,sqlite',
|
|
409
424
|
|
|
410
425
|
' > consistency > consistency',
|
|
@@ -421,18 +436,18 @@ CQL_SPEC = SQL_SPEC + [
|
|
|
421
436
|
|
|
422
437
|
' > clean > clean',
|
|
423
438
|
'clean_ > up > clean_up ^ up all export sessions,up export session',
|
|
424
|
-
'clean_up_ > all > clean_up_all ^ all export sessions,export
|
|
439
|
+
'clean_up_ > all > clean_up_all ^ all export sessions,export sessions',
|
|
425
440
|
'- > export > clean_up_export',
|
|
426
441
|
'clean_up_all_ > export > clean_up_all_export ^ export sessions',
|
|
427
442
|
'clean_up_all_export_ > sessions > clean_up_all_sessions ^ sessions',
|
|
428
|
-
'clean_up_export_ >
|
|
429
|
-
'
|
|
443
|
+
'clean_up_export_ > sessions > clean_up_export_sessions ^ sessions',
|
|
444
|
+
'clean_up_export_sessions_ > name > clean_up_export_sessions$ ^ export-sessions',
|
|
430
445
|
]
|
|
431
446
|
|
|
432
447
|
CQL_KEYWORDS = SQL_KEYWORDS + [
|
|
433
448
|
'schema', 'keyspace', 'keyspaces', 'tables', 'export', 'copy', 'consistency',
|
|
434
449
|
'quorum', 'all', 'serial', 'one', 'each_quorum', 'local_quorum', 'any', 'local_one', 'two', 'three', 'local_serial', 'to',
|
|
435
|
-
'database', 'databases', 'session', 'sessions', 'clean', 'up', 'athena', 'sqlite', 'csv', 'import'
|
|
450
|
+
'database', 'databases', 'session', 'sessions', 'clean', 'up', 'athena', 'sqlite', 'csv', 'import', 'files'
|
|
436
451
|
]
|
|
437
452
|
|
|
438
453
|
CQL_EXPANDABLE_NAMES = EXPANDABLE_NAMES | {
|
|
@@ -546,7 +561,7 @@ class SqlStateMachine(StateMachine[Token]):
|
|
|
546
561
|
elif token.ttype == TOKEN.Operator.Comparison:
|
|
547
562
|
it = 'comparison'
|
|
548
563
|
|
|
549
|
-
|
|
564
|
+
with log_exc(False):
|
|
550
565
|
# print(f'\n{state.to_s} > {it} > ', end='')
|
|
551
566
|
if comeback_state:
|
|
552
567
|
state = comeback_state
|
|
@@ -557,8 +572,6 @@ class SqlStateMachine(StateMachine[Token]):
|
|
|
557
572
|
|
|
558
573
|
if last_name:
|
|
559
574
|
state.context['last_name'] = last_name
|
|
560
|
-
except:
|
|
561
|
-
pass
|
|
562
575
|
|
|
563
576
|
return state
|
|
564
577
|
|
adam/sso/authn_ad.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import re
|
|
3
|
-
import traceback
|
|
4
3
|
import jwt
|
|
5
4
|
import requests
|
|
6
5
|
from urllib.parse import urlparse, parse_qs
|
|
@@ -8,6 +7,7 @@ from urllib.parse import urlparse, parse_qs
|
|
|
8
7
|
from adam.log import Log
|
|
9
8
|
from adam.sso.authenticator import Authenticator
|
|
10
9
|
from adam.sso.id_token import IdToken
|
|
10
|
+
from adam.utils import debug, log_exc
|
|
11
11
|
from .idp_login import IdpLogin
|
|
12
12
|
from adam.config import Config
|
|
13
13
|
|
|
@@ -33,7 +33,7 @@ class AdAuthenticator(Authenticator):
|
|
|
33
33
|
|
|
34
34
|
session = requests.Session()
|
|
35
35
|
r = session.get(idp_uri)
|
|
36
|
-
|
|
36
|
+
debug(f'{r.status_code} {idp_uri}')
|
|
37
37
|
|
|
38
38
|
config = self.validate_and_return_config(r)
|
|
39
39
|
|
|
@@ -52,7 +52,7 @@ class AdAuthenticator(Authenticator):
|
|
|
52
52
|
r = session.post(login_uri, data=body, headers={
|
|
53
53
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
54
54
|
})
|
|
55
|
-
|
|
55
|
+
debug(f'{r.status_code} {login_uri}')
|
|
56
56
|
|
|
57
57
|
config = self.validate_and_return_config(r)
|
|
58
58
|
|
|
@@ -69,7 +69,7 @@ class AdAuthenticator(Authenticator):
|
|
|
69
69
|
r = session.post(kmsi_uri, data=body, headers={
|
|
70
70
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
71
71
|
})
|
|
72
|
-
|
|
72
|
+
debug(f'{r.status_code} {kmsi_uri}')
|
|
73
73
|
|
|
74
74
|
if (config := self.extract_config_object(r.text)):
|
|
75
75
|
if 'sErrorCode' in config and config['sErrorCode'] == '50058':
|
|
@@ -101,7 +101,7 @@ class AdAuthenticator(Authenticator):
|
|
|
101
101
|
|
|
102
102
|
def validate_and_return_config(self, r: requests.Response):
|
|
103
103
|
if r.status_code < 200 or r.status_code >= 300:
|
|
104
|
-
|
|
104
|
+
debug(r.text)
|
|
105
105
|
|
|
106
106
|
return None
|
|
107
107
|
|
|
@@ -138,7 +138,7 @@ class AdAuthenticator(Authenticator):
|
|
|
138
138
|
|
|
139
139
|
def parse_id_token(self, id_token: str) -> IdToken:
|
|
140
140
|
jwks_url = Config().get('idps.ad.jwks-uri', '')
|
|
141
|
-
|
|
141
|
+
with log_exc():
|
|
142
142
|
jwks_client = jwt.PyJWKClient(jwks_url, cache_jwk_set=True, lifespan=360)
|
|
143
143
|
signing_key = jwks_client.get_signing_key_from_jwt(id_token)
|
|
144
144
|
data = jwt.decode(
|
|
@@ -163,7 +163,5 @@ class AdAuthenticator(Authenticator):
|
|
|
163
163
|
nbf=data['nbf'] if 'nbf' in data else 0,
|
|
164
164
|
exp=data['exp'] if 'exp' in data else 0
|
|
165
165
|
)
|
|
166
|
-
except:
|
|
167
|
-
Config().debug(traceback.format_exc())
|
|
168
166
|
|
|
169
167
|
return None
|
adam/sso/authn_okta.py
CHANGED
|
@@ -8,7 +8,7 @@ from adam.sso.id_token import IdToken
|
|
|
8
8
|
|
|
9
9
|
from .idp_login import IdpLogin
|
|
10
10
|
from adam.config import Config
|
|
11
|
-
from adam.utils import log2
|
|
11
|
+
from adam.utils import debug, log2, log_exc
|
|
12
12
|
|
|
13
13
|
class OktaException(Exception):
|
|
14
14
|
pass
|
|
@@ -49,7 +49,7 @@ class OktaAuthenticator(Authenticator):
|
|
|
49
49
|
|
|
50
50
|
session = requests.Session()
|
|
51
51
|
response = session.post(authn_uri, headers=headers, data=json.dumps(payload))
|
|
52
|
-
|
|
52
|
+
debug(f'{response.status_code} {authn_uri}')
|
|
53
53
|
auth_response = response.json()
|
|
54
54
|
|
|
55
55
|
if 'sessionToken' not in auth_response:
|
|
@@ -59,7 +59,7 @@ class OktaAuthenticator(Authenticator):
|
|
|
59
59
|
|
|
60
60
|
url = f'{idp_uri}&sessionToken={session_token}'
|
|
61
61
|
r = session.get(url)
|
|
62
|
-
|
|
62
|
+
debug(f'{r.status_code} {url}')
|
|
63
63
|
|
|
64
64
|
id_token = OktaAuthenticator().extract(r.text, r'.*name=\"id_token\" value=\"(.*?)\".*')
|
|
65
65
|
if not id_token:
|
|
@@ -95,7 +95,7 @@ class OktaAuthenticator(Authenticator):
|
|
|
95
95
|
return None
|
|
96
96
|
|
|
97
97
|
jwks_url = Config().get('idps.okta.jwks-uri', 'https://c3energy.okta.com/oauth2/v1/keys')
|
|
98
|
-
|
|
98
|
+
with log_exc():
|
|
99
99
|
jwks_client = jwt.PyJWKClient(jwks_url, cache_jwk_set=True, lifespan=360)
|
|
100
100
|
signing_key = jwks_client.get_signing_key_from_jwt(id_token)
|
|
101
101
|
data = jwt.decode(
|
|
@@ -121,7 +121,5 @@ class OktaAuthenticator(Authenticator):
|
|
|
121
121
|
nbf=data['nbf'] if 'nbf' in data else 0,
|
|
122
122
|
exp=data['exp'] if 'exp' in data else 0
|
|
123
123
|
)
|
|
124
|
-
except:
|
|
125
|
-
pass
|
|
126
124
|
|
|
127
125
|
return None
|
adam/sso/cred_cache.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
import traceback
|
|
4
3
|
from dotenv import load_dotenv
|
|
5
4
|
|
|
6
5
|
from adam.config import Config
|
|
6
|
+
from adam.utils import debug, log_exc
|
|
7
7
|
from adam.utils_k8s.kube_context import KubeContext
|
|
8
8
|
|
|
9
9
|
class CredCache:
|
|
@@ -34,10 +34,8 @@ class CredCache:
|
|
|
34
34
|
def cache(self, username: str, password: str = None):
|
|
35
35
|
if os.path.exists(self.env_f):
|
|
36
36
|
with open(self.env_f, 'w') as file:
|
|
37
|
-
|
|
37
|
+
with log_exc():
|
|
38
38
|
file.truncate()
|
|
39
|
-
except:
|
|
40
|
-
Config().debug(traceback.format_exc())
|
|
41
39
|
|
|
42
40
|
updated = []
|
|
43
41
|
updated.append(f'IDP_USERNAME={username}')
|
|
@@ -56,4 +54,4 @@ class CredCache:
|
|
|
56
54
|
if password:
|
|
57
55
|
self.overrides['IDP_PASSWORD'] = password
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
debug(f'Cached username: {username}, password: {password}, try load: {self.get_username()}')
|
adam/sso/idp.py
CHANGED
|
@@ -3,7 +3,6 @@ import getpass
|
|
|
3
3
|
import os
|
|
4
4
|
import sys
|
|
5
5
|
import termios
|
|
6
|
-
import traceback
|
|
7
6
|
from typing import Callable, TypeVar
|
|
8
7
|
import requests
|
|
9
8
|
from kubernetes import config
|
|
@@ -15,7 +14,7 @@ from .cred_cache import CredCache
|
|
|
15
14
|
from .idp_session import IdpSession
|
|
16
15
|
from .idp_login import IdpLogin
|
|
17
16
|
from adam.config import Config
|
|
18
|
-
from adam.utils import log,
|
|
17
|
+
from adam.utils import debug, log, log_exc
|
|
19
18
|
|
|
20
19
|
T = TypeVar('T')
|
|
21
20
|
|
|
@@ -31,6 +30,8 @@ class Idp:
|
|
|
31
30
|
def login(app_host: str, username: str = None, idp_uri: str = None, forced = False, use_token_from_env = True, use_cached_creds = True, verify = True) -> IdpLogin:
|
|
32
31
|
session: IdpSession = IdpSession.create(username, app_host, app_host, idp_uri=idp_uri)
|
|
33
32
|
|
|
33
|
+
debug(f'Idp.login({username})')
|
|
34
|
+
|
|
34
35
|
if use_token_from_env:
|
|
35
36
|
if l0 := session.login_from_env_var():
|
|
36
37
|
return l0
|
|
@@ -39,11 +40,9 @@ class Idp:
|
|
|
39
40
|
token_server = Config().get('app.login.token-server-url', 'http://localhost:{port}').replace('{port}', port)
|
|
40
41
|
res: requests.Response = requests.get(token_server)
|
|
41
42
|
if res.status_code == 200 and res.text:
|
|
42
|
-
|
|
43
|
+
with log_exc():
|
|
43
44
|
# may fail if the idp token is not complete
|
|
44
45
|
return session.login_from_token(res.text)
|
|
45
|
-
except:
|
|
46
|
-
pass
|
|
47
46
|
|
|
48
47
|
r: IdpLogin = None
|
|
49
48
|
try:
|
|
@@ -57,10 +56,11 @@ class Idp:
|
|
|
57
56
|
default_user: str = None
|
|
58
57
|
if use_cached_creds:
|
|
59
58
|
default_user = CredCache().get_username()
|
|
60
|
-
|
|
59
|
+
debug(f'User read from cache: {default_user}')
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
# no value in using USERNAME
|
|
62
|
+
# if from_env := os.getenv('USERNAME') and in_docker():
|
|
63
|
+
# default_user = from_env
|
|
64
64
|
if default_user and default_user != username:
|
|
65
65
|
session = IdpSession.create(default_user, app_host, app_host)
|
|
66
66
|
|
|
@@ -125,7 +125,7 @@ class Idp:
|
|
|
125
125
|
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
126
126
|
|
|
127
127
|
def try_kubeconfig(username: str, kubeconfig: str):
|
|
128
|
-
|
|
128
|
+
with log_exc():
|
|
129
129
|
if kubeconfig[0] == '\t':
|
|
130
130
|
kubeconfig = kubeconfig[1:]
|
|
131
131
|
kubeconfig_string = base64.b64decode(kubeconfig.encode('ascii') + b'==').decode('utf-8')
|
|
@@ -136,8 +136,5 @@ class Idp:
|
|
|
136
136
|
Secrets.list_secrets(os.getenv('NAMESPACE'))
|
|
137
137
|
|
|
138
138
|
return IdpLogin(None, None, None, username)
|
|
139
|
-
except:
|
|
140
|
-
Config().debug(traceback.format_exc())
|
|
141
|
-
pass
|
|
142
139
|
|
|
143
140
|
return None
|