cmdbox 0.6.3.2__py3-none-any.whl → 0.6.4.1__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 cmdbox might be problematic. Click here for more details.
- cmdbox/app/app.py +22 -7
- cmdbox/app/common.py +9 -6
- cmdbox/app/commons/loghandler.py +101 -20
- cmdbox/app/commons/redis_client.py +1 -1
- cmdbox/app/edge.py +2 -4
- cmdbox/app/feature.py +1 -1
- cmdbox/app/features/cli/cmdbox_agent_mcp_client.py +175 -0
- cmdbox/app/features/cli/cmdbox_agent_mcp_proxy.py +96 -0
- cmdbox/app/features/cli/cmdbox_audit_createdb.py +224 -224
- cmdbox/app/features/cli/cmdbox_audit_delete.py +4 -4
- cmdbox/app/features/cli/cmdbox_audit_search.py +4 -4
- cmdbox/app/features/cli/cmdbox_audit_write.py +6 -8
- cmdbox/app/features/cli/cmdbox_client_file_copy.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_download.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_list.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_mkdir.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_move.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_remove.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_rmdir.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_file_upload.py +3 -3
- cmdbox/app/features/cli/cmdbox_client_http.py +7 -6
- cmdbox/app/features/cli/cmdbox_client_server_info.py +4 -4
- cmdbox/app/features/cli/cmdbox_cmd_list.py +4 -4
- cmdbox/app/features/cli/cmdbox_cmd_load.py +5 -5
- cmdbox/app/features/cli/cmdbox_edge_config.py +1 -1
- cmdbox/app/features/cli/cmdbox_edge_start.py +3 -3
- cmdbox/app/features/cli/cmdbox_mcp_client.py +174 -174
- cmdbox/app/features/cli/cmdbox_mcp_proxy.py +96 -96
- cmdbox/app/features/cli/cmdbox_server_list.py +3 -3
- cmdbox/app/features/cli/cmdbox_server_start.py +103 -103
- cmdbox/app/features/cli/cmdbox_server_stop.py +6 -6
- cmdbox/app/features/cli/cmdbox_tts_install.py +317 -0
- cmdbox/app/features/cli/cmdbox_tts_say.py +179 -0
- cmdbox/app/features/cli/cmdbox_tts_start.py +329 -0
- cmdbox/app/features/cli/cmdbox_tts_stop.py +108 -0
- cmdbox/app/features/cli/cmdbox_web_apikey_add.py +91 -91
- cmdbox/app/features/cli/cmdbox_web_apikey_del.py +91 -91
- cmdbox/app/features/cli/cmdbox_web_gencert.py +7 -7
- cmdbox/app/features/cli/cmdbox_web_genpass.py +168 -168
- cmdbox/app/features/cli/cmdbox_web_group_add.py +94 -94
- cmdbox/app/features/cli/cmdbox_web_group_del.py +87 -87
- cmdbox/app/features/cli/cmdbox_web_group_edit.py +94 -94
- cmdbox/app/features/cli/cmdbox_web_group_list.py +87 -87
- cmdbox/app/features/cli/cmdbox_web_start.py +236 -235
- cmdbox/app/features/cli/cmdbox_web_stop.py +72 -72
- cmdbox/app/features/cli/cmdbox_web_user_add.py +104 -104
- cmdbox/app/features/cli/cmdbox_web_user_del.py +87 -87
- cmdbox/app/features/cli/cmdbox_web_user_edit.py +104 -104
- cmdbox/app/features/cli/cmdbox_web_user_list.py +87 -87
- cmdbox/app/features/web/cmdbox_web_agent.py +16 -4
- cmdbox/app/features/web/cmdbox_web_get_cmd_choices.py +10 -2
- cmdbox/app/features/web/cmdbox_web_save_cmd.py +1 -0
- cmdbox/app/features/web/cmdbox_web_versions_used.py +4 -0
- cmdbox/app/filer.py +9 -9
- cmdbox/app/mcp.py +19 -8
- cmdbox/app/options.py +52 -47
- cmdbox/app/server.py +224 -224
- cmdbox/app/web.py +39 -17
- cmdbox/extensions/features.yml +7 -1
- cmdbox/extensions/sample_project/sample/app/features/cli/sample_client_time.py +2 -2
- cmdbox/extensions/sample_project/sample/app/features/cli/sample_server_time.py +3 -3
- cmdbox/licenses/LICENSE_APScheduler_3_11_0_MIT_License.txt +19 -0
- cmdbox/licenses/LICENSE_SQLAlchemy_2_0_43_MIT.txt +19 -0
- cmdbox/licenses/LICENSE_Werkzeug_3_1_1_BSD_License.txt +28 -0
- cmdbox/licenses/LICENSE_absolufy-imports_0_3_1_MIT_License.txt +21 -0
- cmdbox/licenses/LICENSE_anyio_4_10_0_UNKNOWN.txt +20 -0
- cmdbox/licenses/{LICENSE_typer_0_16_0_MIT_License.txt → LICENSE_backoff_2_2_1_MIT_License.txt} +1 -1
- cmdbox/licenses/LICENSE_certifi_2025_8_3_Mozilla_Public_License_2_0-MPL_2_0.txt +20 -0
- cmdbox/licenses/LICENSE_charset-normalizer_3_4_3_MIT.txt +21 -0
- cmdbox/licenses/LICENSE_cryptography_45_0_6_Apache-2_0_OR_BSD-3-Clause.txt +3 -0
- cmdbox/licenses/LICENSE_cyclopts_3_22_5_Apache_Software_License.txt +201 -0
- cmdbox/licenses/LICENSE_fastapi-sso_0_18_0_MIT_License.txt +21 -0
- cmdbox/licenses/LICENSE_fastmcp_2_11_3_Apache_Software_License.txt +201 -0
- cmdbox/licenses/LICENSE_google-adk_1_9_0_Apache_Software_License.txt +202 -0
- cmdbox/licenses/LICENSE_google-genai_1_28_0_Apache_Software_License.txt +202 -0
- cmdbox/licenses/LICENSE_google-genai_1_29_0_Apache_Software_License.txt +202 -0
- cmdbox/licenses/LICENSE_greenlet_3_2_4_MIT_AND_Python-2_0.txt +30 -0
- cmdbox/licenses/LICENSE_isodate_0_7_2_BSD_License.txt +26 -0
- cmdbox/licenses/LICENSE_lazy-object-proxy_1_11_0_BSD_License.txt +20 -0
- cmdbox/licenses/LICENSE_litellm-enterprise_0_1_19_UNKNOWN.txt +37 -0
- cmdbox/licenses/LICENSE_litellm_1_75_5_post1_MIT_License.txt +26 -0
- cmdbox/licenses/LICENSE_markdown-it-py_4_0_0_MIT_License.txt +21 -0
- cmdbox/licenses/LICENSE_mcp_1_12_4_MIT_License.txt +21 -0
- cmdbox/licenses/LICENSE_multidict_6_6_4_Apache_License_2_0.txt +13 -0
- cmdbox/licenses/LICENSE_oauthlib_3_3_1_BSD-3-Clause.txt +27 -0
- cmdbox/licenses/LICENSE_openai_1_99_9_Apache_Software_License.txt +201 -0
- cmdbox/licenses/LICENSE_openapi-core_0_19_5_BSD_License.txt +29 -0
- cmdbox/licenses/LICENSE_openapi-schema-validator_0_6_3_BSD_License.txt +29 -0
- cmdbox/licenses/LICENSE_openapi-spec-validator_0_7_2_Apache_Software_License.txt +201 -0
- cmdbox/licenses/LICENSE_opentelemetry-api_1_36_0_UNKNOWN.txt +201 -0
- cmdbox/licenses/LICENSE_opentelemetry-sdk_1_36_0_UNKNOWN.txt +201 -0
- cmdbox/licenses/LICENSE_opentelemetry-semantic-conventions_0_57b0_UNKNOWN.txt +201 -0
- cmdbox/licenses/LICENSE_orjson_3_11_1_Apache_Software_License-MIT_License.txt +201 -0
- cmdbox/licenses/LICENSE_parse_1_20_2_MIT_License.txt +19 -0
- cmdbox/licenses/LICENSE_pathable_0_4_4_Apache_Software_License.txt +201 -0
- cmdbox/licenses/{LICENSE_pillow_11_2_1_UNKNOWN.txt → LICENSE_pillow_11_3_0_UNKNOWN.txt} +393 -3
- cmdbox/licenses/LICENSE_pyperclip_1_9_0_BSD_License.txt +27 -0
- cmdbox/licenses/LICENSE_redis_6_4_0_MIT_License.txt +21 -0
- cmdbox/licenses/LICENSE_rfc3339-validator_0_1_4_MIT_License.txt +22 -0
- cmdbox/licenses/LICENSE_rich-rst_1_3_1_MIT_License.txt +7 -0
- cmdbox/licenses/LICENSE_rpds-py_0_27_0_UNKNOWN.txt +19 -0
- cmdbox/licenses/{LICENSE_setuptools_65_5_0_MIT_License.txt → LICENSE_setuptools_80_9_0_UNKNOWN.txt} +0 -2
- cmdbox/licenses/LICENSE_sphinx-intl_2_3_2_UNKNOWN.txt +25 -0
- cmdbox/licenses/LICENSE_tenacity_9_1_2_Apache_Software_License.txt +202 -0
- cmdbox/licenses/LICENSE_tiktoken_0_11_0_MIT_License-Copyright-c-2022_OpenAI-Shantanu_Jain-Permission_is_hereby_granted-free_of_charge-to_any_per.txt +21 -0
- cmdbox/licenses/LICENSE_tokenizers_0_21_4_Apache_Software_License.txt +1 -0
- cmdbox/licenses/LICENSE_voicevox_core_0_16_0_MIT.txt +20 -0
- cmdbox/licenses/LICENSE_watchdog_6_0_0_Apache_Software_License.txt +16 -0
- cmdbox/licenses/{LICENSE_httptools_0_6_4_MIT_License.txt → LICENSE_wsproto_1_2_0_MIT_License.txt} +3 -3
- cmdbox/licenses/files.txt +69 -50
- cmdbox/logconf_cmdbox.yml +136 -0
- cmdbox/version.py +2 -2
- cmdbox/web/agent.html +16 -2
- cmdbox/web/assets/cmdbox/agent.js +226 -1
- cmdbox/web/assets/cmdbox/common.js +20 -25
- cmdbox/web/assets/cmdbox/svgicon.js +18 -0
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/METADATA +29 -20
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/RECORD +158 -118
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/WHEEL +1 -1
- cmdbox/config.yml +0 -3
- cmdbox/licenses/LICENSE_shellingham_1_5_4_ISC_License-ISCL.txt +0 -13
- cmdbox/licenses/LICENSE_watchfiles_1_1_0_MIT_License.txt +0 -21
- cmdbox/logconf_audit.yml +0 -43
- cmdbox/logconf_client.yml +0 -43
- cmdbox/logconf_edge.yml +0 -43
- cmdbox/logconf_gui.yml +0 -43
- cmdbox/logconf_mcp.yml +0 -43
- cmdbox/logconf_server.yml +0 -43
- cmdbox/logconf_web.yml +0 -43
- /cmdbox/licenses/{LICENSE_Authlib_1_6_0_BSD_License.txt → LICENSE_Authlib_1_6_1_BSD_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_SQLAlchemy_2_0_41_MIT.txt → LICENSE_SQLAlchemy_2_0_42_MIT.txt} +0 -0
- /cmdbox/licenses/{LICENSE_aiohttp_3_12_13_Apache-2_0.txt → LICENSE_aiohttp_3_12_15_Apache-2_0_AND_MIT.txt} +0 -0
- /cmdbox/licenses/{LICENSE_aiosignal_1_3_2_Apache_Software_License.txt → LICENSE_aiosignal_1_4_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_certifi_2025_6_15_Mozilla_Public_License_2_0-MPL_2_0.txt → LICENSE_certifi_2025_7_14_Mozilla_Public_License_2_0-MPL_2_0.txt} +0 -0
- /cmdbox/licenses/{LICENSE_cryptography_45_0_4_Apache-2_0_OR_BSD-3-Clause.txt → LICENSE_cryptography_45_0_5_Apache-2_0_OR_BSD-3-Clause.txt} +0 -0
- /cmdbox/licenses/{LICENSE_docstring_parser_0_16_MIT_License.txt → LICENSE_docstring_parser_0_17_0_MIT_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_fastapi_0_115_14_MIT_License.txt → LICENSE_fastapi_0_116_1_MIT_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_fastmcp_2_10_1_Apache_Software_License.txt → LICENSE_fastmcp_2_11_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_fsspec_2025_5_1_BSD_License.txt → LICENSE_fsspec_2025_7_0_BSD_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_google-adk_1_5_0_Apache_Software_License.txt → LICENSE_google-adk_1_10_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_google-api-python-client_2_174_0_Apache_Software_License.txt → LICENSE_google-api-python-client_2_177_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_huggingface-hub_0_33_1_Apache_Software_License.txt → LICENSE_google-api-python-client_2_178_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_google-cloud-aiplatform_1_100_0_Apache_2_0.txt → LICENSE_google-cloud-aiplatform_1_106_0_Apache_2_0.txt} +0 -0
- /cmdbox/licenses/{LICENSE_google-cloud-bigquery_3_34_0_Apache_Software_License.txt → LICENSE_google-cloud-aiplatform_1_108_0_Apache_2_0.txt} +0 -0
- /cmdbox/licenses/{LICENSE_google-genai_1_23_0_Apache_Software_License.txt → LICENSE_google-cloud-bigquery_3_35_1_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_grpcio-status_1_73_1_Apache_Software_License.txt → LICENSE_grpcio-status_1_74_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_grpcio_1_73_1_Apache_Software_License.txt → LICENSE_grpcio_1_74_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_opentelemetry-api_1_34_1_Apache_Software_License.txt → LICENSE_huggingface-hub_0_34_3_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_opentelemetry-sdk_1_34_1_Apache_Software_License.txt → LICENSE_huggingface-hub_0_34_4_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_opentelemetry-semantic-conventions_0_55b1_Apache_Software_License.txt → LICENSE_jsonschema-path_0_3_4_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_jsonschema_4_24_0_UNKNOWN.txt → LICENSE_jsonschema_4_25_0_UNKNOWN.txt} +0 -0
- /cmdbox/licenses/{LICENSE_litellm_1_73_6_MIT_License.txt → LICENSE_litellm_1_74_12_MIT_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_mcp_1_10_1_MIT_License.txt → LICENSE_mcp_1_12_3_MIT_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_multidict_6_6_2_Apache_License_2_0.txt → LICENSE_multidict_6_6_3_Apache_License_2_0.txt} +0 -0
- /cmdbox/licenses/{LICENSE_nh3_0_2_21_MIT.txt → LICENSE_nh3_0_3_0_MIT.txt} +0 -0
- /cmdbox/licenses/{LICENSE_numpy_2_3_1_BSD_License.txt → LICENSE_numpy_2_3_2_BSD_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_openai_1_93_0_Apache_Software_License.txt → LICENSE_openai_1_98_0_Apache_Software_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_tokenizers_0_21_2_Apache_Software_License.txt → LICENSE_pywin32_311_Python_Software_Foundation_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_regex_2024_11_6_Apache_Software_License.txt → LICENSE_regex_2025_7_34_UNKNOWN.txt} +0 -0
- /cmdbox/licenses/{LICENSE_rich_14_0_0_MIT_License.txt → LICENSE_rich_14_1_0_MIT_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_rpds-py_0_25_1_MIT.txt → LICENSE_rpds-py_0_26_0_MIT.txt} +0 -0
- /cmdbox/licenses/{LICENSE_sse-starlette_2_3_6_BSD_License.txt → LICENSE_sse-starlette_3_0_2_UNKNOWN.txt} +0 -0
- /cmdbox/licenses/{LICENSE_starlette_0_46_2_BSD_License.txt → LICENSE_starlette_0_47_2_BSD_License.txt} +0 -0
- /cmdbox/licenses/{LICENSE_typing_extensions_4_14_0_UNKNOWN.txt → LICENSE_typing_extensions_4_14_1_UNKNOWN.txt} +0 -0
- /cmdbox/licenses/{LICENSE_zope_event_5_1_Zope_Public_License.txt → LICENSE_zope_event_5_1_1_Zope_Public_License.txt} +0 -0
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/entry_points.txt +0 -0
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info/licenses}/LICENSE +0 -0
- {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/top_level.txt +0 -0
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
from cmdbox.app import common, feature
|
|
2
|
-
from cmdbox.app.options import Options
|
|
3
|
-
from cryptography.hazmat.primitives import hashes
|
|
4
|
-
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
5
|
-
from cryptography.hazmat.primitives import serialization
|
|
6
|
-
from cryptography import x509
|
|
7
|
-
from datetime import datetime, timedelta, timezone
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from typing import Dict, Any, Tuple, List, Union
|
|
10
|
-
import argparse
|
|
11
|
-
import logging
|
|
12
|
-
import re
|
|
13
|
-
import string
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class WebGenpass(feature.OneshotResultEdgeFeature):
|
|
17
|
-
def get_mode(self) -> Union[str, List[str]]:
|
|
18
|
-
"""
|
|
19
|
-
この機能のモードを返します
|
|
20
|
-
|
|
21
|
-
Returns:
|
|
22
|
-
Union[str, List[str]]: モード
|
|
23
|
-
"""
|
|
24
|
-
return 'web'
|
|
25
|
-
|
|
26
|
-
def get_cmd(self):
|
|
27
|
-
"""
|
|
28
|
-
この機能のコマンドを返します
|
|
29
|
-
|
|
30
|
-
Returns:
|
|
31
|
-
str: コマンド
|
|
32
|
-
"""
|
|
33
|
-
return 'genpass'
|
|
34
|
-
|
|
35
|
-
def get_option(self):
|
|
36
|
-
"""
|
|
37
|
-
この機能のオプションを返します
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
Dict[str, Any]: オプション
|
|
41
|
-
"""
|
|
42
|
-
return dict(
|
|
43
|
-
use_redis=self.USE_REDIS_FALSE, nouse_webmode=False,
|
|
44
|
-
description_ja="webモードで使用できるパスワード文字列を生成します。",
|
|
45
|
-
description_en="Generates a password string that can be used in web mode.",
|
|
46
|
-
choice=[
|
|
47
|
-
dict(opt="pass_length", type=Options.T_INT, default=16, required=False, multi=False, hide=False, choice=None,
|
|
48
|
-
description_ja="パスワードの長さを指定します。",
|
|
49
|
-
description_en="Specifies the length of the password."),
|
|
50
|
-
dict(opt="pass_count", type=Options.T_INT, default=5, required=False, multi=False, hide=False, choice=None,
|
|
51
|
-
description_ja="生成するパスワードの件数を指定します。",
|
|
52
|
-
description_en="Specify the number of passwords to be generated."),
|
|
53
|
-
dict(opt="use_alphabet", type=Options.T_STR, default='both', required=False, multi=False, hide=False, choice=['notuse','upper','lower','both'],
|
|
54
|
-
description_ja="パスワードに使用するアルファベットの種類を指定します。 `notuse` , `upper` , `lower` , `both` が指定できます。",
|
|
55
|
-
description_en="Specifies the type of alphabet used for the password. `notuse` , `upper` , `lower` , `both` can be specified."),
|
|
56
|
-
dict(opt="use_number", type=Options.T_STR, default="use", required=False, multi=False, hide=False, choice=['notuse', 'use'],
|
|
57
|
-
description_ja="パスワードに使用する数字の種類を指定します。 `notuse` , `use` が指定できます。",
|
|
58
|
-
description_en="Specify the type of number to be used for the password. `notuse` , `use` can be specified."),
|
|
59
|
-
dict(opt="use_symbol", type=Options.T_STR, default='use', required=False, multi=False, hide=False, choice=['notuse','use'],
|
|
60
|
-
description_ja="パスワードに使用する記号の種類を指定します。 `notuse` , `use` が指定できます。",
|
|
61
|
-
description_en="Specifies the type of symbol used in the password. `notuse` , `use` can be specified."),
|
|
62
|
-
dict(opt="similar", type=Options.T_STR, default='exclude', required=False, multi=False, hide=True, choice=['exclude', 'include'],
|
|
63
|
-
description_ja="特定の似た文字を使用するかどうかを指定します。 `exclude` , `include` が指定できます。",
|
|
64
|
-
description_en="Specifies whether certain similar characters should be used. `exclude` , `include` can be specified."),
|
|
65
|
-
dict(opt="stdout_log", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
66
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をConsole logに出力します。",
|
|
67
|
-
description_en="Available only in GUI mode. Outputs standard output during command execution to Console log."),
|
|
68
|
-
dict(opt="capture_stdout", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
69
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をキャプチャーし、実行結果画面に表示します。",
|
|
70
|
-
description_en="Available only in GUI mode. Captures standard output during command execution and displays it on the execution result screen."),
|
|
71
|
-
dict(opt="capture_maxsize", type=Options.T_INT, default=self.DEFAULT_CAPTURE_MAXSIZE, required=False, multi=False, hide=True, choice=None,
|
|
72
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力の最大キャプチャーサイズを指定します。",
|
|
73
|
-
description_en="Available only in GUI mode. Specifies the maximum capture size of standard output when executing commands."),
|
|
74
|
-
]
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
def apprun(self, logger:logging.Logger, args:argparse.Namespace, tm:float, pf:List[Dict[str, float]]=[]) -> Tuple[int, Dict[str, Any], Any]:
|
|
78
|
-
"""
|
|
79
|
-
この機能の実行を行います
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
logger (logging.Logger): ロガー
|
|
83
|
-
args (argparse.Namespace): 引数
|
|
84
|
-
tm (float): 実行開始時間
|
|
85
|
-
pf (List[Dict[str, float]]): 呼出元のパフォーマンス情報
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
Tuple[int, Dict[str, Any], Any]: 終了コード, 結果, オブジェクト
|
|
89
|
-
"""
|
|
90
|
-
if args.pass_length < 1:
|
|
91
|
-
msg = dict(warn="The password length must be 1 or more.")
|
|
92
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
93
|
-
return
|
|
94
|
-
if args.pass_count < 1:
|
|
95
|
-
msg = dict(warn="The number of passwords to generate must be 1 or more.")
|
|
96
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
97
|
-
return
|
|
98
|
-
if args.pass_count >= 40:
|
|
99
|
-
msg = dict(warn="The number of passwords to generate must be less than 40.")
|
|
100
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
101
|
-
return
|
|
102
|
-
ret = {}
|
|
103
|
-
try:
|
|
104
|
-
chars = ""
|
|
105
|
-
if args.use_alphabet == 'upper' or args.use_alphabet == 'both':
|
|
106
|
-
chars += string.ascii_uppercase
|
|
107
|
-
if args.use_alphabet == 'lower' or args.use_alphabet == 'both':
|
|
108
|
-
chars += string.ascii_lowercase
|
|
109
|
-
if args.use_number == 'use':
|
|
110
|
-
chars += string.digits
|
|
111
|
-
if args.use_symbol == 'use':
|
|
112
|
-
chars += '!#$%&()=-~^|@;+:*{}[]<>/_,.'
|
|
113
|
-
if args.similar == 'exclude':
|
|
114
|
-
chars = re.sub('[\{\}\[\]Il1\|Oo0\.\,:;]', '', chars)
|
|
115
|
-
|
|
116
|
-
passwords = []
|
|
117
|
-
for i in range(args.pass_count):
|
|
118
|
-
passwords.append(dict(password=common.random_string(args.pass_length, chars)))
|
|
119
|
-
ret = dict(success=dict(passwords=passwords))
|
|
120
|
-
common.print_format(ret, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
121
|
-
except Exception as e:
|
|
122
|
-
msg = dict(error=f"Failed to generate password. {e}")
|
|
123
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
124
|
-
return
|
|
125
|
-
return
|
|
126
|
-
|
|
127
|
-
def gen_cert(self, logger:logging.Logger, webhost:str,
|
|
128
|
-
output_cert:Path, output_cert_format:str,
|
|
129
|
-
output_key:Path, output_key_format:str) -> None:
|
|
130
|
-
# 秘密鍵の作成
|
|
131
|
-
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
|
|
132
|
-
# 秘密鍵の保存
|
|
133
|
-
with open(output_key, "wb") as f:
|
|
134
|
-
f.write(private_key.private_bytes(
|
|
135
|
-
encoding=serialization.Encoding.DER if output_key_format == "DER" else serialization.Encoding.PEM,
|
|
136
|
-
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
|
137
|
-
encryption_algorithm=serialization.NoEncryption() #BestAvailableEncryption(b"passphrase"),
|
|
138
|
-
))
|
|
139
|
-
logger.info(f"Save private key. {output_key}")
|
|
140
|
-
|
|
141
|
-
# 自己署名証明書の作成
|
|
142
|
-
subject = issuer = x509.Name([
|
|
143
|
-
x509.NameAttribute(x509.NameOID.COMMON_NAME, webhost)
|
|
144
|
-
])
|
|
145
|
-
self_cert = x509.CertificateBuilder().subject_name(
|
|
146
|
-
subject
|
|
147
|
-
).issuer_name(
|
|
148
|
-
issuer
|
|
149
|
-
).public_key(
|
|
150
|
-
private_key.public_key()
|
|
151
|
-
).serial_number(
|
|
152
|
-
x509.random_serial_number()
|
|
153
|
-
).not_valid_before(
|
|
154
|
-
datetime.now(timezone.utc)
|
|
155
|
-
).not_valid_after(
|
|
156
|
-
datetime.now(timezone.utc) + timedelta(days=365*10)
|
|
157
|
-
).add_extension(
|
|
158
|
-
x509.BasicConstraints(ca=True, path_length=None),
|
|
159
|
-
critical=True,
|
|
160
|
-
).add_extension(
|
|
161
|
-
x509.SubjectAlternativeName([x509.DNSName(webhost)]),
|
|
162
|
-
critical=False,
|
|
163
|
-
).sign(private_key, hashes.SHA256())
|
|
164
|
-
|
|
165
|
-
# 自己署名証明書の保存
|
|
166
|
-
with open(output_cert, "wb") as f:
|
|
167
|
-
f.write(self_cert.public_bytes(serialization.Encoding.DER if output_cert_format == "DER" else serialization.Encoding.PEM))
|
|
168
|
-
logger.info(f"Save self-signed certificate. {output_cert}")
|
|
1
|
+
from cmdbox.app import common, feature
|
|
2
|
+
from cmdbox.app.options import Options
|
|
3
|
+
from cryptography.hazmat.primitives import hashes
|
|
4
|
+
from cryptography.hazmat.primitives.asymmetric import rsa
|
|
5
|
+
from cryptography.hazmat.primitives import serialization
|
|
6
|
+
from cryptography import x509
|
|
7
|
+
from datetime import datetime, timedelta, timezone
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Dict, Any, Tuple, List, Union
|
|
10
|
+
import argparse
|
|
11
|
+
import logging
|
|
12
|
+
import re
|
|
13
|
+
import string
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class WebGenpass(feature.OneshotResultEdgeFeature):
|
|
17
|
+
def get_mode(self) -> Union[str, List[str]]:
|
|
18
|
+
"""
|
|
19
|
+
この機能のモードを返します
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Union[str, List[str]]: モード
|
|
23
|
+
"""
|
|
24
|
+
return 'web'
|
|
25
|
+
|
|
26
|
+
def get_cmd(self):
|
|
27
|
+
"""
|
|
28
|
+
この機能のコマンドを返します
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
str: コマンド
|
|
32
|
+
"""
|
|
33
|
+
return 'genpass'
|
|
34
|
+
|
|
35
|
+
def get_option(self):
|
|
36
|
+
"""
|
|
37
|
+
この機能のオプションを返します
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Dict[str, Any]: オプション
|
|
41
|
+
"""
|
|
42
|
+
return dict(
|
|
43
|
+
use_redis=self.USE_REDIS_FALSE, nouse_webmode=False, use_agent=True,
|
|
44
|
+
description_ja="webモードで使用できるパスワード文字列を生成します。",
|
|
45
|
+
description_en="Generates a password string that can be used in web mode.",
|
|
46
|
+
choice=[
|
|
47
|
+
dict(opt="pass_length", type=Options.T_INT, default=16, required=False, multi=False, hide=False, choice=None,
|
|
48
|
+
description_ja="パスワードの長さを指定します。",
|
|
49
|
+
description_en="Specifies the length of the password."),
|
|
50
|
+
dict(opt="pass_count", type=Options.T_INT, default=5, required=False, multi=False, hide=False, choice=None,
|
|
51
|
+
description_ja="生成するパスワードの件数を指定します。",
|
|
52
|
+
description_en="Specify the number of passwords to be generated."),
|
|
53
|
+
dict(opt="use_alphabet", type=Options.T_STR, default='both', required=False, multi=False, hide=False, choice=['notuse','upper','lower','both'],
|
|
54
|
+
description_ja="パスワードに使用するアルファベットの種類を指定します。 `notuse` , `upper` , `lower` , `both` が指定できます。",
|
|
55
|
+
description_en="Specifies the type of alphabet used for the password. `notuse` , `upper` , `lower` , `both` can be specified."),
|
|
56
|
+
dict(opt="use_number", type=Options.T_STR, default="use", required=False, multi=False, hide=False, choice=['notuse', 'use'],
|
|
57
|
+
description_ja="パスワードに使用する数字の種類を指定します。 `notuse` , `use` が指定できます。",
|
|
58
|
+
description_en="Specify the type of number to be used for the password. `notuse` , `use` can be specified."),
|
|
59
|
+
dict(opt="use_symbol", type=Options.T_STR, default='use', required=False, multi=False, hide=False, choice=['notuse','use'],
|
|
60
|
+
description_ja="パスワードに使用する記号の種類を指定します。 `notuse` , `use` が指定できます。",
|
|
61
|
+
description_en="Specifies the type of symbol used in the password. `notuse` , `use` can be specified."),
|
|
62
|
+
dict(opt="similar", type=Options.T_STR, default='exclude', required=False, multi=False, hide=True, choice=['exclude', 'include'],
|
|
63
|
+
description_ja="特定の似た文字を使用するかどうかを指定します。 `exclude` , `include` が指定できます。",
|
|
64
|
+
description_en="Specifies whether certain similar characters should be used. `exclude` , `include` can be specified."),
|
|
65
|
+
dict(opt="stdout_log", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
66
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をConsole logに出力します。",
|
|
67
|
+
description_en="Available only in GUI mode. Outputs standard output during command execution to Console log."),
|
|
68
|
+
dict(opt="capture_stdout", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
69
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をキャプチャーし、実行結果画面に表示します。",
|
|
70
|
+
description_en="Available only in GUI mode. Captures standard output during command execution and displays it on the execution result screen."),
|
|
71
|
+
dict(opt="capture_maxsize", type=Options.T_INT, default=self.DEFAULT_CAPTURE_MAXSIZE, required=False, multi=False, hide=True, choice=None,
|
|
72
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力の最大キャプチャーサイズを指定します。",
|
|
73
|
+
description_en="Available only in GUI mode. Specifies the maximum capture size of standard output when executing commands."),
|
|
74
|
+
]
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def apprun(self, logger:logging.Logger, args:argparse.Namespace, tm:float, pf:List[Dict[str, float]]=[]) -> Tuple[int, Dict[str, Any], Any]:
|
|
78
|
+
"""
|
|
79
|
+
この機能の実行を行います
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
logger (logging.Logger): ロガー
|
|
83
|
+
args (argparse.Namespace): 引数
|
|
84
|
+
tm (float): 実行開始時間
|
|
85
|
+
pf (List[Dict[str, float]]): 呼出元のパフォーマンス情報
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Tuple[int, Dict[str, Any], Any]: 終了コード, 結果, オブジェクト
|
|
89
|
+
"""
|
|
90
|
+
if args.pass_length < 1:
|
|
91
|
+
msg = dict(warn="The password length must be 1 or more.")
|
|
92
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
93
|
+
return self.RESP_WARN, msg, None
|
|
94
|
+
if args.pass_count < 1:
|
|
95
|
+
msg = dict(warn="The number of passwords to generate must be 1 or more.")
|
|
96
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
97
|
+
return self.RESP_WARN, msg, None
|
|
98
|
+
if args.pass_count >= 40:
|
|
99
|
+
msg = dict(warn="The number of passwords to generate must be less than 40.")
|
|
100
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
101
|
+
return self.RESP_WARN, msg, None
|
|
102
|
+
ret = {}
|
|
103
|
+
try:
|
|
104
|
+
chars = ""
|
|
105
|
+
if args.use_alphabet == 'upper' or args.use_alphabet == 'both':
|
|
106
|
+
chars += string.ascii_uppercase
|
|
107
|
+
if args.use_alphabet == 'lower' or args.use_alphabet == 'both':
|
|
108
|
+
chars += string.ascii_lowercase
|
|
109
|
+
if args.use_number == 'use':
|
|
110
|
+
chars += string.digits
|
|
111
|
+
if args.use_symbol == 'use':
|
|
112
|
+
chars += '!#$%&()=-~^|@;+:*{}[]<>/_,.'
|
|
113
|
+
if args.similar == 'exclude':
|
|
114
|
+
chars = re.sub('[\{\}\[\]Il1\|Oo0\.\,:;]', '', chars)
|
|
115
|
+
|
|
116
|
+
passwords = []
|
|
117
|
+
for i in range(args.pass_count):
|
|
118
|
+
passwords.append(dict(password=common.random_string(args.pass_length, chars)))
|
|
119
|
+
ret = dict(success=dict(passwords=passwords))
|
|
120
|
+
common.print_format(ret, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
121
|
+
except Exception as e:
|
|
122
|
+
msg = dict(error=f"Failed to generate password. {e}")
|
|
123
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
124
|
+
return self.RESP_WARN, msg, None
|
|
125
|
+
return self.RESP_SUCCESS, ret, None
|
|
126
|
+
|
|
127
|
+
def gen_cert(self, logger:logging.Logger, webhost:str,
|
|
128
|
+
output_cert:Path, output_cert_format:str,
|
|
129
|
+
output_key:Path, output_key_format:str) -> None:
|
|
130
|
+
# 秘密鍵の作成
|
|
131
|
+
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
|
|
132
|
+
# 秘密鍵の保存
|
|
133
|
+
with open(output_key, "wb") as f:
|
|
134
|
+
f.write(private_key.private_bytes(
|
|
135
|
+
encoding=serialization.Encoding.DER if output_key_format == "DER" else serialization.Encoding.PEM,
|
|
136
|
+
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
|
137
|
+
encryption_algorithm=serialization.NoEncryption() #BestAvailableEncryption(b"passphrase"),
|
|
138
|
+
))
|
|
139
|
+
logger.info(f"Save private key. {output_key}")
|
|
140
|
+
|
|
141
|
+
# 自己署名証明書の作成
|
|
142
|
+
subject = issuer = x509.Name([
|
|
143
|
+
x509.NameAttribute(x509.NameOID.COMMON_NAME, webhost)
|
|
144
|
+
])
|
|
145
|
+
self_cert = x509.CertificateBuilder().subject_name(
|
|
146
|
+
subject
|
|
147
|
+
).issuer_name(
|
|
148
|
+
issuer
|
|
149
|
+
).public_key(
|
|
150
|
+
private_key.public_key()
|
|
151
|
+
).serial_number(
|
|
152
|
+
x509.random_serial_number()
|
|
153
|
+
).not_valid_before(
|
|
154
|
+
datetime.now(timezone.utc)
|
|
155
|
+
).not_valid_after(
|
|
156
|
+
datetime.now(timezone.utc) + timedelta(days=365*10)
|
|
157
|
+
).add_extension(
|
|
158
|
+
x509.BasicConstraints(ca=True, path_length=None),
|
|
159
|
+
critical=True,
|
|
160
|
+
).add_extension(
|
|
161
|
+
x509.SubjectAlternativeName([x509.DNSName(webhost)]),
|
|
162
|
+
critical=False,
|
|
163
|
+
).sign(private_key, hashes.SHA256())
|
|
164
|
+
|
|
165
|
+
# 自己署名証明書の保存
|
|
166
|
+
with open(output_cert, "wb") as f:
|
|
167
|
+
f.write(self_cert.public_bytes(serialization.Encoding.DER if output_cert_format == "DER" else serialization.Encoding.PEM))
|
|
168
|
+
logger.info(f"Save self-signed certificate. {output_cert}")
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
from cmdbox.app import common, feature, web
|
|
2
|
-
from cmdbox.app.options import Options
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import Dict, Any, Tuple, List, Union
|
|
5
|
-
import argparse
|
|
6
|
-
import logging
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class WebGroupAdd(feature.UnsupportEdgeFeature):
|
|
10
|
-
def get_mode(self) -> Union[str, List[str]]:
|
|
11
|
-
"""
|
|
12
|
-
この機能のモードを返します
|
|
13
|
-
|
|
14
|
-
Returns:
|
|
15
|
-
Union[str, List[str]]: モード
|
|
16
|
-
"""
|
|
17
|
-
return 'web'
|
|
18
|
-
|
|
19
|
-
def get_cmd(self):
|
|
20
|
-
"""
|
|
21
|
-
この機能のコマンドを返します
|
|
22
|
-
|
|
23
|
-
Returns:
|
|
24
|
-
str: コマンド
|
|
25
|
-
"""
|
|
26
|
-
return 'group_add'
|
|
27
|
-
|
|
28
|
-
def get_option(self):
|
|
29
|
-
"""
|
|
30
|
-
この機能のオプションを返します
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
Dict[str, Any]: オプション
|
|
34
|
-
"""
|
|
35
|
-
return dict(
|
|
36
|
-
use_redis=self.USE_REDIS_MEIGHT, nouse_webmode=False,
|
|
37
|
-
description_ja="Webモードのグループを追加します。",
|
|
38
|
-
description_en="Add a group in Web mode.",
|
|
39
|
-
choice=[
|
|
40
|
-
dict(opt="group_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
|
|
41
|
-
description_ja="グループIDを指定します。他のグループと重複しないようにしてください。",
|
|
42
|
-
description_en="Specify the group ID. Do not duplicate other groups."),
|
|
43
|
-
dict(opt="group_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
|
|
44
|
-
description_ja="グループ名を指定します。他のグループと重複しないようにしてください。",
|
|
45
|
-
description_en="Specify a group name. Do not duplicate other groups."),
|
|
46
|
-
dict(opt="group_parent", type=Options.T_STR, default=None, required=False, multi=False, hide=False, choice=None,
|
|
47
|
-
description_ja="親グループ名を指定します。",
|
|
48
|
-
description_en="Specifies the parent group name."),
|
|
49
|
-
dict(opt="signin_file", type=Options.T_FILE, default=f".{self.ver.__appid__}/user_list.yml", required=True, multi=False, hide=False, choice=None, fileio="in",
|
|
50
|
-
description_ja="サインイン可能なユーザーとパスワードを記載したファイルを指定します。省略した時は認証を要求しません。",
|
|
51
|
-
description_en="Specify a file containing users and passwords with which they can signin. If omitted, no authentication is required."),
|
|
52
|
-
dict(opt="stdout_log", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
53
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をConsole logに出力します。",
|
|
54
|
-
description_en="Available only in GUI mode. Outputs standard output during command execution to Console log."),
|
|
55
|
-
dict(opt="capture_stdout", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
56
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をキャプチャーし、実行結果画面に表示します。",
|
|
57
|
-
description_en="Available only in GUI mode. Captures standard output during command execution and displays it on the execution result screen."),
|
|
58
|
-
dict(opt="capture_maxsize", type=Options.T_INT, default=self.DEFAULT_CAPTURE_MAXSIZE, required=False, multi=False, hide=True, choice=None,
|
|
59
|
-
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力の最大キャプチャーサイズを指定します。",
|
|
60
|
-
description_en="Available only in GUI mode. Specifies the maximum capture size of standard output when executing commands."),
|
|
61
|
-
]
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
def apprun(self, logger:logging.Logger, args:argparse.Namespace, tm:float, pf:List[Dict[str, float]]=[]) -> Tuple[int, Dict[str, Any], Any]:
|
|
65
|
-
"""
|
|
66
|
-
この機能の実行を行います
|
|
67
|
-
|
|
68
|
-
Args:
|
|
69
|
-
logger (logging.Logger): ロガー
|
|
70
|
-
args (argparse.Namespace): 引数
|
|
71
|
-
tm (float): 実行開始時間
|
|
72
|
-
pf (List[Dict[str, float]]): 呼出元のパフォーマンス情報
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
Tuple[int, Dict[str, Any], Any]: 終了コード, 結果, オブジェクト
|
|
76
|
-
"""
|
|
77
|
-
if args.data is None:
|
|
78
|
-
msg = dict(warn=f"Please specify the --data option.")
|
|
79
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
80
|
-
return
|
|
81
|
-
w = None
|
|
82
|
-
try:
|
|
83
|
-
w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
|
|
84
|
-
redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
|
|
85
|
-
signin_file=args.signin_file)
|
|
86
|
-
group = dict(gid=args.group_id, name=args.group_name, parent=args.group_parent)
|
|
87
|
-
w.group_add(group)
|
|
88
|
-
msg = dict(success=f"group ID {args.group_id} has been added.")
|
|
89
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
90
|
-
return
|
|
91
|
-
except Exception as e:
|
|
92
|
-
msg = dict(warn=f"{e}")
|
|
93
|
-
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
94
|
-
return
|
|
1
|
+
from cmdbox.app import common, feature, web
|
|
2
|
+
from cmdbox.app.options import Options
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Dict, Any, Tuple, List, Union
|
|
5
|
+
import argparse
|
|
6
|
+
import logging
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class WebGroupAdd(feature.UnsupportEdgeFeature):
|
|
10
|
+
def get_mode(self) -> Union[str, List[str]]:
|
|
11
|
+
"""
|
|
12
|
+
この機能のモードを返します
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Union[str, List[str]]: モード
|
|
16
|
+
"""
|
|
17
|
+
return 'web'
|
|
18
|
+
|
|
19
|
+
def get_cmd(self):
|
|
20
|
+
"""
|
|
21
|
+
この機能のコマンドを返します
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
str: コマンド
|
|
25
|
+
"""
|
|
26
|
+
return 'group_add'
|
|
27
|
+
|
|
28
|
+
def get_option(self):
|
|
29
|
+
"""
|
|
30
|
+
この機能のオプションを返します
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Dict[str, Any]: オプション
|
|
34
|
+
"""
|
|
35
|
+
return dict(
|
|
36
|
+
use_redis=self.USE_REDIS_MEIGHT, nouse_webmode=False, use_agent=False,
|
|
37
|
+
description_ja="Webモードのグループを追加します。",
|
|
38
|
+
description_en="Add a group in Web mode.",
|
|
39
|
+
choice=[
|
|
40
|
+
dict(opt="group_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
|
|
41
|
+
description_ja="グループIDを指定します。他のグループと重複しないようにしてください。",
|
|
42
|
+
description_en="Specify the group ID. Do not duplicate other groups."),
|
|
43
|
+
dict(opt="group_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
|
|
44
|
+
description_ja="グループ名を指定します。他のグループと重複しないようにしてください。",
|
|
45
|
+
description_en="Specify a group name. Do not duplicate other groups."),
|
|
46
|
+
dict(opt="group_parent", type=Options.T_STR, default=None, required=False, multi=False, hide=False, choice=None,
|
|
47
|
+
description_ja="親グループ名を指定します。",
|
|
48
|
+
description_en="Specifies the parent group name."),
|
|
49
|
+
dict(opt="signin_file", type=Options.T_FILE, default=f".{self.ver.__appid__}/user_list.yml", required=True, multi=False, hide=False, choice=None, fileio="in",
|
|
50
|
+
description_ja="サインイン可能なユーザーとパスワードを記載したファイルを指定します。省略した時は認証を要求しません。",
|
|
51
|
+
description_en="Specify a file containing users and passwords with which they can signin. If omitted, no authentication is required."),
|
|
52
|
+
dict(opt="stdout_log", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
53
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をConsole logに出力します。",
|
|
54
|
+
description_en="Available only in GUI mode. Outputs standard output during command execution to Console log."),
|
|
55
|
+
dict(opt="capture_stdout", type=Options.T_BOOL, default=True, required=False, multi=False, hide=True, choice=[True, False],
|
|
56
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力をキャプチャーし、実行結果画面に表示します。",
|
|
57
|
+
description_en="Available only in GUI mode. Captures standard output during command execution and displays it on the execution result screen."),
|
|
58
|
+
dict(opt="capture_maxsize", type=Options.T_INT, default=self.DEFAULT_CAPTURE_MAXSIZE, required=False, multi=False, hide=True, choice=None,
|
|
59
|
+
description_ja="GUIモードでのみ使用可能です。コマンド実行時の標準出力の最大キャプチャーサイズを指定します。",
|
|
60
|
+
description_en="Available only in GUI mode. Specifies the maximum capture size of standard output when executing commands."),
|
|
61
|
+
]
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def apprun(self, logger:logging.Logger, args:argparse.Namespace, tm:float, pf:List[Dict[str, float]]=[]) -> Tuple[int, Dict[str, Any], Any]:
|
|
65
|
+
"""
|
|
66
|
+
この機能の実行を行います
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
logger (logging.Logger): ロガー
|
|
70
|
+
args (argparse.Namespace): 引数
|
|
71
|
+
tm (float): 実行開始時間
|
|
72
|
+
pf (List[Dict[str, float]]): 呼出元のパフォーマンス情報
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Tuple[int, Dict[str, Any], Any]: 終了コード, 結果, オブジェクト
|
|
76
|
+
"""
|
|
77
|
+
if args.data is None:
|
|
78
|
+
msg = dict(warn=f"Please specify the --data option.")
|
|
79
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
80
|
+
return self.RESP_WARN, msg, None
|
|
81
|
+
w = None
|
|
82
|
+
try:
|
|
83
|
+
w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
|
|
84
|
+
redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
|
|
85
|
+
signin_file=args.signin_file)
|
|
86
|
+
group = dict(gid=args.group_id, name=args.group_name, parent=args.group_parent)
|
|
87
|
+
w.group_add(group)
|
|
88
|
+
msg = dict(success=f"group ID {args.group_id} has been added.")
|
|
89
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
90
|
+
return self.RESP_SUCCESS, msg, w
|
|
91
|
+
except Exception as e:
|
|
92
|
+
msg = dict(warn=f"{e}")
|
|
93
|
+
common.print_format(msg, args.format, tm, args.output_json, args.output_json_append, pf=pf)
|
|
94
|
+
return self.RESP_WARN, msg, w
|