cmdbox 0.6.3__py3-none-any.whl → 0.6.3.2__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 CHANGED
@@ -18,7 +18,9 @@ class CmdBoxApp:
18
18
  @staticmethod
19
19
  def getInstance(appcls=None, ver=version, cli_features_packages:List[str]=None, cli_features_prefix:List[str]=None):
20
20
  if CmdBoxApp._instance is None:
21
- CmdBoxApp._instance = CmdBoxApp(appcls=appcls, ver=ver, cli_features_packages=cli_features_packages, cli_features_prefix=cli_features_prefix)
21
+ _self = appcls.__new__(appcls)
22
+ _self.__init__(appcls=appcls, ver=ver, cli_features_packages=cli_features_packages, cli_features_prefix=cli_features_prefix)
23
+ CmdBoxApp._instance = _self
22
24
  return CmdBoxApp._instance
23
25
 
24
26
  def __init__(self, appcls=None, ver=version, cli_features_packages:List[str]=None, cli_features_prefix:List[str]=None):
@@ -145,12 +147,12 @@ class CmdBoxApp:
145
147
  if logger.level == logging.DEBUG:
146
148
  logger.debug(f"args.mode={args.mode}, args.cmd={args.cmd}")
147
149
  # 警告出力時にスタックを出力する
148
- #import warnings
149
- #def custom_warning_handler(message, category, filename, lineno, file=None, line=None):
150
- # import traceback
151
- # print(f"Warning: {message}, Category: {category}, File: {filename}, Line: {lineno}")
152
- # traceback.print_stack()
153
- #warnings.showwarning = custom_warning_handler
150
+ import warnings
151
+ def custom_warning_handler(message, category, filename, lineno, file=None, line=None):
152
+ import traceback
153
+ logger.warning(f"Warning: {message}, Category: {category}, File: {filename}, Line: {lineno}", exc_info=True)
154
+ traceback.print_stack()
155
+ warnings.showwarning = custom_warning_handler
154
156
 
155
157
  #scmdexectime = time.perf_counter()
156
158
  feat = self.options.get_cmd_attr(args.mode, args.cmd, 'feature')
cmdbox/app/common.py CHANGED
@@ -3,9 +3,8 @@ from cmdbox.app import feature, options
3
3
  from cmdbox.app.commons import convert, module, loghandler
4
4
  from cryptography.fernet import Fernet
5
5
  from pathlib import Path
6
- from pkg_resources import resource_string
7
- from rich.logging import RichHandler
8
6
  from rich.console import Console
7
+ from rich.logging import RichHandler
9
8
  from tabulate import tabulate
10
9
  from typing import List, Tuple, Dict, Any
11
10
  import argparse
@@ -133,10 +132,11 @@ def reset_logger(name:str, stderr:bool=False, fmt:str='[%(asctime)s] %(levelname
133
132
  level (int, optional): ログレベル. Defaults to logging.INFO.
134
133
  """
135
134
  logger = logging.getLogger(name)
135
+ #colorful = [h for h in logger.handlers if isinstance(h, loghandler.ColorfulStreamHandler) or isinstance(h, RichHandler)]
136
136
  logger.handlers.clear()
137
137
  logger.propagate = False
138
138
  logger.setLevel(level)
139
- logger.addHandler(create_log_handler(stderr, fmt, datefmt, level))
139
+ logger.addHandler(create_log_handler(stderr, fmt, datefmt, level, colorful=True))
140
140
  if get_common_value('webcall', False):
141
141
  # webcallの場合はStreamHandlerを削除
142
142
  for handler in logger.handlers:
@@ -144,7 +144,7 @@ def reset_logger(name:str, stderr:bool=False, fmt:str='[%(asctime)s] %(levelname
144
144
  if issubclass(hc, logging.StreamHandler) and not issubclass(hc, logging.FileHandler):
145
145
  logger.removeHandler(handler)
146
146
 
147
- def create_log_handler(stderr:bool=False, fmt:str='[%(asctime)s] %(levelname)s - %(message)s', datefmt:str='%Y-%m-%d %H:%M:%S', level:int=logging.INFO) -> logging.Handler:
147
+ def create_log_handler(stderr:bool=False, fmt:str='[%(asctime)s] %(levelname)s - %(message)s', datefmt:str='%Y-%m-%d %H:%M:%S', level:int=logging.INFO, colorful:bool=True) -> logging.Handler:
148
148
  """
149
149
  ログハンドラを生成します。
150
150
 
@@ -152,13 +152,18 @@ def create_log_handler(stderr:bool=False, fmt:str='[%(asctime)s] %(levelname)s -
152
152
  stderr (bool, optional): 標準エラー出力を使用するかどうか. Defaults to False.
153
153
  fmt (str, optional): ログフォーマット. Defaults to '[%(asctime)s] %(levelname)s - %(message)s'.
154
154
  datefmt (str, optional): 日時フォーマット. Defaults to '%Y-%m-%d %H:%M:%S'.
155
+ level (int, optional): ログレベル. Defaults to logging.INFO.
156
+ colorful (bool, optional): カラフルなログを使用するかどうか. Defaults to True.
155
157
  Returns:
156
158
  logging.Handler: ログハンドラ
157
159
  """
158
160
  formatter = logging.Formatter(fmt, datefmt)
159
161
  #handler = RichHandler(console=Console(stderr=stderr), show_path=False, omit_repeated_times=False,
160
162
  # tracebacks_word_wrap=False, log_time_format='[%Y-%m-%d %H:%M]')
161
- handler = loghandler.ColorfulStreamHandler(sys.stdout if not stderr else sys.stderr)
163
+ if colorful:
164
+ handler = loghandler.ColorfulStreamHandler(sys.stdout if not stderr else sys.stderr)
165
+ else:
166
+ handler = logging.StreamHandler(sys.stdout if not stderr else sys.stderr)
162
167
  handler.setFormatter(formatter)
163
168
  handler.setLevel(level)
164
169
  return handler
@@ -180,7 +185,7 @@ def create_console(stderr:bool=False, file=None) -> Console:
180
185
  #console = Console(soft_wrap=True, stderr=stderr, file=file, log_time=True, log_path=False, log_time_format='[%Y-%m-%d %H:%M:%S]')
181
186
  return console
182
187
 
183
- def console_log(console:Console, message:Any, **kwargs) -> None:
188
+ def console_log(console:Console, message:Any, highlight:bool=True, **kwargs) -> None:
184
189
  """
185
190
  コンソールにログを出力します。
186
191
 
@@ -190,7 +195,7 @@ def console_log(console:Console, message:Any, **kwargs) -> None:
190
195
  **kwargs: その他のキーワード引数
191
196
  """
192
197
  dtstr = datetime.datetime.now().strftime('[%Y-%m-%d %H:%M:%S]')
193
- console.print(f"{dtstr} {message}", highlight=True, **kwargs)
198
+ console.print(f"{dtstr} {message}", highlight=highlight, **kwargs)
194
199
 
195
200
  def default_logger(debug:bool=False, ver=version, webcall:bool=False) -> logging.Logger:
196
201
  """
@@ -269,8 +274,7 @@ def load_config(mode:str, debug:bool=False, data=HOME_DIR, webcall:bool=False, v
269
274
  logging.config.dictConfig(log_config)
270
275
  logger = logging.getLogger(log_name)
271
276
  set_debug(logger, debug)
272
- config = yaml.safe_load(resource_string(version.__appid__, "config.yml"))
273
- return logger, config
277
+ return logger, {}
274
278
 
275
279
  def set_debug(logger:logging.Logger, debug:bool=False) -> None:
276
280
  """
@@ -144,7 +144,10 @@ class ColorfulStreamHandler(logging.StreamHandler):
144
144
  #super().emit(record)
145
145
  record.levelname = level_mapping_nc[record.levelno]
146
146
  record.msg = self.format(record)
147
- self.console.print(record.msg)
147
+ try:
148
+ self.console.print(record.msg)
149
+ except Exception as e:
150
+ self.console.print(record.msg, highlight=False)
148
151
 
149
152
  class TimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
150
153
  def emit(self, record: logging.LogRecord) -> None:
@@ -37,24 +37,9 @@ class WebApikeyAdd(feature.UnsupportEdgeFeature):
37
37
  description_ja="WebモードのユーザーのApiKeyを追加します。",
38
38
  description_en="Add an ApiKey for a user in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
56
- description_ja="ユーザー名を指定します。他のユーザーと重複しないようにしてください。",
57
- description_en="Specify a user name. Do not duplicate other users."),
41
+ description_ja="対象のユーザー名を指定します。",
42
+ description_en="Specify the target user name."),
58
43
  dict(opt="apikey_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
59
44
  description_ja="このユーザーのApiKey名を指定します。",
60
45
  description_en="Specify the ApiKey name for this user."),
@@ -92,8 +77,8 @@ class WebApikeyAdd(feature.UnsupportEdgeFeature):
92
77
  return 1, msg, None
93
78
  w = None
94
79
  try:
95
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
96
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
80
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
81
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
97
82
  signin_file=args.signin_file)
98
83
  user = dict(name=args.user_name, apikey_name=args.apikey_name)
99
84
  apikey = w.apikey_add(user)
@@ -37,24 +37,9 @@ class WebApikeyDel(feature.UnsupportEdgeFeature):
37
37
  description_ja="WebモードのユーザーのApiKeyを削除します。",
38
38
  description_en="Del an ApiKey for a user in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
56
- description_ja="ユーザー名を指定します。他のユーザーと重複しないようにしてください。",
57
- description_en="Specify a user name. Do not duplicate other users."),
41
+ description_ja="対象のユーザー名を指定します。",
42
+ description_en="Specify the target user name."),
58
43
  dict(opt="apikey_name", type=Options.T_STR, default=None, required=True, multi=False, hide=False, choice=None,
59
44
  description_ja="このユーザーのApiKey名を指定します。",
60
45
  description_en="Specify the ApiKey name for this user."),
@@ -92,8 +77,8 @@ class WebApikeyDel(feature.UnsupportEdgeFeature):
92
77
  return 1, msg, None
93
78
  w = None
94
79
  try:
95
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
96
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
80
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
81
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
97
82
  signin_file=args.signin_file)
98
83
  user = dict(name=args.user_name, apikey_name=args.apikey_name)
99
84
  w.apikey_del(user)
@@ -37,21 +37,6 @@ class WebGroupAdd(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのグループを追加します。",
38
38
  description_en="Add a group in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="group_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="グループIDを指定します。他のグループと重複しないようにしてください。",
57
42
  description_en="Specify the group ID. Do not duplicate other groups."),
@@ -95,8 +80,8 @@ class WebGroupAdd(feature.UnsupportEdgeFeature):
95
80
  return 1, msg, None
96
81
  w = None
97
82
  try:
98
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
99
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
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,
100
85
  signin_file=args.signin_file)
101
86
  group = dict(gid=args.group_id, name=args.group_name, parent=args.group_parent)
102
87
  w.group_add(group)
@@ -37,21 +37,6 @@ class WebGroupDel(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのグループを削除します。",
38
38
  description_en="Del a group in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="group_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="グループIDを指定します。",
57
42
  description_en="Specify the group ID. Do not duplicate other groups."),
@@ -89,8 +74,8 @@ class WebGroupDel(feature.UnsupportEdgeFeature):
89
74
  return 1, msg, None
90
75
  w = None
91
76
  try:
92
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
93
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
77
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
78
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
94
79
  signin_file=args.signin_file)
95
80
  w.group_del(args.group_id)
96
81
  msg = dict(success=f"group ID {args.group_id} has been deleted.")
@@ -37,21 +37,6 @@ class WebGroupEdit(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのグループを編集します。",
38
38
  description_en="Edit a group in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="group_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="グループIDを指定します。",
57
42
  description_en="Specify the group ID. Do not duplicate other groups."),
@@ -95,8 +80,8 @@ class WebGroupEdit(feature.UnsupportEdgeFeature):
95
80
  return 1, msg, None
96
81
  w = None
97
82
  try:
98
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
99
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
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,
100
85
  signin_file=args.signin_file)
101
86
  group = dict(gid=args.group_id, name=args.group_name, parent=args.group_parent)
102
87
  w.group_edit(group)
@@ -37,21 +37,6 @@ class WebGroupList(feature.OneshotResultEdgeFeature):
37
37
  description_ja="Webモードのグループー一覧を取得します。",
38
38
  description_en="Get a list of users in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="group_name", type=Options.T_STR, default=None, required=False, multi=False, hide=False, choice=None,
56
41
  description_ja="グループ名を指定して取得します。省略した時は全てのグループを取得します。",
57
42
  description_en="Retrieved by specifying a group name. If omitted, all groups are retrieved."),
@@ -89,8 +74,8 @@ class WebGroupList(feature.OneshotResultEdgeFeature):
89
74
  return 1, msg, None
90
75
  w = None
91
76
  try:
92
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
93
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
77
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
78
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
94
79
  signin_file=args.signin_file)
95
80
  groups = w.group_list(args.group_name)
96
81
  msg = dict(success=groups)
@@ -37,21 +37,6 @@ class WebUserAdd(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのユーザーを追加します。",
38
38
  description_en="Add a user in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="ユーザーIDを指定します。他のユーザーと重複しないようにしてください。",
57
42
  description_en="Specify the user ID. Do not duplicate other users."),
@@ -104,8 +89,8 @@ class WebUserAdd(feature.UnsupportEdgeFeature):
104
89
  return 1, msg, None
105
90
  w = None
106
91
  try:
107
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
108
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
92
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
93
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
109
94
  signin_file=args.signin_file)
110
95
  user = dict(uid=args.user_id, name=args.user_name, password=args.user_pass, hash=args.user_pass_hash,
111
96
  email=args.user_email, groups=args.user_group)
@@ -37,21 +37,6 @@ class WebUserDel(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのユーザーを削除します。",
38
38
  description_en="Delete a user in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="ユーザーIDを指定します。",
57
42
  description_en="Specify the user ID."),
@@ -89,8 +74,8 @@ class WebUserDel(feature.UnsupportEdgeFeature):
89
74
  return 1, msg, None
90
75
  w = None
91
76
  try:
92
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
93
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
77
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
78
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
94
79
  signin_file=args.signin_file)
95
80
  w.user_del(args.user_id)
96
81
  msg = dict(success=f"User ID {args.user_id} has been deleted.")
@@ -37,21 +37,6 @@ class WebUserEdit(feature.UnsupportEdgeFeature):
37
37
  description_ja="Webモードのユーザーを編集します。",
38
38
  description_en="Edit users in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_id", type=Options.T_INT, default=None, required=True, multi=False, hide=False, choice=None,
56
41
  description_ja="ユーザーIDを指定します。",
57
42
  description_en="Specify the user ID."),
@@ -104,8 +89,8 @@ class WebUserEdit(feature.UnsupportEdgeFeature):
104
89
  return 1, msg, None
105
90
  w = None
106
91
  try:
107
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
108
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
92
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
93
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
109
94
  signin_file=args.signin_file)
110
95
  user = dict(uid=args.user_id, name=args.user_name, password=args.user_pass, hash=args.user_pass_hash,
111
96
  email=args.user_email, groups=args.user_group)
@@ -37,21 +37,6 @@ class WebUserList(feature.OneshotResultEdgeFeature):
37
37
  description_ja="Webモードのユーザー一覧を取得します。",
38
38
  description_en="Get a list of users in Web mode.",
39
39
  choice=[
40
- dict(opt="host", type=Options.T_STR, default=self.default_host, required=True, multi=False, hide=True, choice=None, web="mask",
41
- description_ja="Redisサーバーのサービスホストを指定します。",
42
- description_en="Specify the service host of the Redis server."),
43
- dict(opt="port", type=Options.T_INT, default=self.default_port, required=True, multi=False, hide=True, choice=None, web="mask",
44
- description_ja="Redisサーバーのサービスポートを指定します。",
45
- description_en="Specify the service port of the Redis server."),
46
- dict(opt="password", type=Options.T_STR, default=self.default_pass, required=True, multi=False, hide=True, choice=None, web="mask",
47
- description_ja="Redisサーバーのアクセスパスワード(任意)を指定します。省略時は `password` を使用します。",
48
- description_en="Specify the access password of the Redis server (optional). If omitted, `password` is used."),
49
- dict(opt="svname", type=Options.T_STR, default=self.default_svname, required=True, multi=False, hide=True, choice=None, web="readonly",
50
- description_ja="サーバーのサービス名を指定します。省略時は `server` を使用します。",
51
- description_en="Specify the service name of the inference server. If omitted, `server` is used."),
52
- dict(opt="data", type=Options.T_DIR, default=self.default_data, required=False, multi=False, hide=False, choice=None,
53
- description_ja=f"省略した時は `$HONE/.{self.ver.__appid__}` を使用します。",
54
- description_en=f"When omitted, `$HONE/.{self.ver.__appid__}` is used."),
55
40
  dict(opt="user_name", type=Options.T_STR, default=None, required=False, multi=False, hide=False, choice=None,
56
41
  description_ja="ユーザー名を指定して取得します。省略した時は全てのユーザーを取得します。",
57
42
  description_en="Retrieved by specifying a user name. If omitted, all users are retrieved."),
@@ -89,8 +74,8 @@ class WebUserList(feature.OneshotResultEdgeFeature):
89
74
  return 1, msg, None
90
75
  w = None
91
76
  try:
92
- w = web.Web(logger, Path(args.data), appcls=self.appcls, ver=self.ver,
93
- redis_host=args.host, redis_port=args.port, redis_password=args.password, svname=args.svname,
77
+ w = web.Web(logger, self.default_data, appcls=self.appcls, ver=self.ver,
78
+ redis_host=self.default_host, redis_port=self.default_port, redis_password=self.default_pass, svname=self.default_svname,
94
79
  signin_file=args.signin_file)
95
80
  users = w.user_list(args.user_name)
96
81
  msg = dict(success=users)
@@ -182,7 +182,7 @@ class ExecCmd(cmdbox_web_load_cmd.LoadCmd):
182
182
  console = common.create_console(file=old_stdout)
183
183
 
184
184
  try:
185
- common.console_log(console, f'EXEC - {opt_list}\n'[:logsize])
185
+ common.console_log(console, message=f'EXEC - {opt_list}\n'[:logsize], highlight=(len(opt_list)<logsize-10))
186
186
  status, ret_main, obj = cmdbox_app.main(args_list=[common.chopdq(o) for o in opt_list], file_dict=file_dict, webcall=True)
187
187
  if isinstance(obj, server.Server):
188
188
  cmdbox_app.sv = obj
@@ -209,11 +209,11 @@ class ExecCmd(cmdbox_web_load_cmd.LoadCmd):
209
209
  output = [dict(warn=f'The captured stdout was discarded because its size was larger than {capture_maxsize} bytes.')]
210
210
  else:
211
211
  output = [dict(warn='capture_stdout is off.')]
212
- old_stdout.write(f'EXEC OUTPUT => {output}'[:logsize]) # コマンド実行時のアウトプットはカラーリングしない
212
+ old_stdout.write(f'EXEC OUTPUT => {output}'[:logsize]+'\n') # コマンド実行時のアウトプットはカラーリングしない
213
213
  except Exception as e:
214
214
  web.logger.disabled = False # ログ出力を有効にする
215
215
  msg = f'exec_cmd error. {traceback.format_exc()}'
216
- common.console_log(console, f'EXEC - {msg}'[:logsize])
216
+ common.console_log(console, message=f'EXEC - {msg}'[:logsize], highlight=(len(msg)<logsize-10))
217
217
  web.logger.warning(msg)
218
218
  output = [dict(warn=f'<pre>{html.escape(traceback.format_exc())}</pre>')]
219
219
  sys.stdout = old_stdout
cmdbox/app/web.py CHANGED
@@ -475,7 +475,7 @@ class Web:
475
475
  for u in signin_data['users']:
476
476
  if u['uid'] == user['uid']:
477
477
  u['name'] = user['name']
478
- if 'password' in user and user['password'] != '':
478
+ if 'password' in user and user['password'] is not None and user['password'] != '':
479
479
  jadge, msg = self.signin.check_password_policy(user['name'], u['password'], user['password'])
480
480
  if not jadge:
481
481
  raise ValueError(msg)
cmdbox/version.py CHANGED
@@ -1,10 +1,10 @@
1
1
  import datetime
2
2
 
3
- dt_now = datetime.datetime(2025, 7, 28)
3
+ dt_now = datetime.datetime(2025, 7, 30)
4
4
  days_ago = (datetime.datetime.now() - dt_now).days
5
5
  __appid__ = 'cmdbox'
6
6
  __title__ = 'cmdbox (Command Development Application)'
7
- __version__ = '0.6.3'
7
+ __version__ = '0.6.3.2'
8
8
  __copyright__ = f'Copyright © 2023-{dt_now.strftime("%Y")} hamacom2004jp'
9
9
  __pypiurl__ = 'https://pypi.org/project/cmdbox/'
10
10
  __srcurl__ = 'https://github.com/hamacom2004jp/cmdbox'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cmdbox
3
- Version: 0.6.3
3
+ Version: 0.6.3.2
4
4
  Summary: cmdbox: It is a command line application with a plugin mechanism.
5
5
  Home-page: https://github.com/hamacom2004jp/cmdbox
6
6
  Download-URL: https://github.com/hamacom2004jp/cmdbox
@@ -10,11 +10,11 @@ cmdbox/logconf_gui.yml,sha256=-95vyd0q-aB1gsabdk8rg9dJ2zRKAZc8hRxyhNOQboU,1076
10
10
  cmdbox/logconf_mcp.yml,sha256=pED0i1iKP8UoyXE0amFMA5kjV7Qc6_eJCUDVen3L4AU,1069
11
11
  cmdbox/logconf_server.yml,sha256=n3c5-KVzjUzcUX5BQ6uE-PN9rp81yXaJql3whyCcSDQ,1091
12
12
  cmdbox/logconf_web.yml,sha256=pPbdAwckbK0cgduxcVkx2mbk-Ymz5hVzR4guIsfApMQ,1076
13
- cmdbox/version.py,sha256=HTU-X6-2WVXAPOXs7dqpmC2oYd3v69th6uurBQSFxUg,2108
13
+ cmdbox/version.py,sha256=c5x2tcHm2AcB3MgTKcRZATwSV4RFvcauR3hXTECbeTg,2110
14
14
  cmdbox/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- cmdbox/app/app.py,sha256=_UJqSTs3LStGSu3vLMTqOKmpL4x7NQAQb2hUMbEFcg4,9639
15
+ cmdbox/app/app.py,sha256=fJU7h4uiI2y7_ohAep8PeRHy8o4f-SqqiGtZbdbWenE,9723
16
16
  cmdbox/app/client.py,sha256=n986lXeV7hhaki4iyyvsfhNptmCXDFphxlNoNe2XhKg,19542
17
- cmdbox/app/common.py,sha256=iY4Bl9r0MSSDhZ9Ep3Y45MVBapurKpwkBNCHYb-COnY,28130
17
+ cmdbox/app/common.py,sha256=ltB7wIuUY-kybE5Cbfj5lCJpYGQ0BTN1_ErFo965EbU,28487
18
18
  cmdbox/app/edge.py,sha256=2Aav7n4skhP0FUvG6_3JKijHHozA-WcwALgEwNB0DUI,41439
19
19
  cmdbox/app/edge_tool.py,sha256=HXxr4Or8QaZ5ueYIN3huv8GnXSnV28RZCmZBUEfiIk0,8062
20
20
  cmdbox/app/feature.py,sha256=fK7JP1fc8b9k1zhSNOkWq02ad8i-_wuAX5kyyK2TZdE,10391
@@ -22,7 +22,7 @@ cmdbox/app/filer.py,sha256=L_DSMTvnbN_ffr3JIt0obbOmVoTHEfVm2cAVz3rLH-Q,16059
22
22
  cmdbox/app/mcp.py,sha256=ZzpfaZHgNSrTY5Jj5KZzm28LLtW7cAMrS8-NSf6eGMc,32635
23
23
  cmdbox/app/options.py,sha256=GVGq9ID46czZsWNlCHkVf33DrM-1oY5ea90ej1-UnFQ,46268
24
24
  cmdbox/app/server.py,sha256=woOmIk901ONn5a_2yz_b3I1JpLYIF8g42uQRd0_MRuQ,10417
25
- cmdbox/app/web.py,sha256=1T4cRg6TnhB7LA37sePZFgnZAc1hARC7qS6DrRGFcEc,54035
25
+ cmdbox/app/web.py,sha256=7NkbbkpRgRH41qCANvQKyJIqQmTtLv-foiewjS9A9no,54068
26
26
  cmdbox/app/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  cmdbox/app/auth/azure_signin.py,sha256=jJlIZJIGLZCngnJgoxBajaD2s8nM7QoszuN6-FT-5h8,1953
28
28
  cmdbox/app/auth/azure_signin_saml.py,sha256=oM2buGTK4t6-OsUuiUXTlZk0YXZL01khuPYVB84dMDU,472
@@ -31,7 +31,7 @@ cmdbox/app/auth/google_signin.py,sha256=LErFkKniumKgfE5jlY9_lAneKlqD6BfLHxg2lZgv
31
31
  cmdbox/app/auth/signin.py,sha256=wBnZMmi7i4BehlfJtXg4owr5HDLOzQCS6Lc2UO-2dPQ,60022
32
32
  cmdbox/app/auth/signin_saml.py,sha256=MUM_hqCEjT-8xXNMHa-iH2j24SdBls4SU3k4BopRd48,2457
33
33
  cmdbox/app/commons/convert.py,sha256=mkXPNQtX_pEH4L5DzonOY6Dh38SzJ5JQma_EY7UDBqU,7078
34
- cmdbox/app/commons/loghandler.py,sha256=bcKTDqSlUcVpO-6vYGijZcLdJlXn7ewx9MT_N7RhgAY,6323
34
+ cmdbox/app/commons/loghandler.py,sha256=F86USTtVwJHa2-uHWi2Sypq0sNGy0lVfuwwQdl-6QHE,6431
35
35
  cmdbox/app/commons/module.py,sha256=w63zqz5c6gLy-BZJ9dh4Q4C5PZyqM2Iqat5Zr9swJCI,4993
36
36
  cmdbox/app/commons/redis_client.py,sha256=cOHshqAGI3CRWLcc2IMhk6MtXsVKlQq6HwcdqYsoA-0,14821
37
37
  cmdbox/app/features/cli/agent_base.py,sha256=FShwbXWCfU-pXNTRaWfV_9z5FKeczxWsxidDmXeaQI0,7682
@@ -61,20 +61,20 @@ cmdbox/app/features/cli/cmdbox_mcp_proxy.py,sha256=xQ3832CdeUZ1WVRQcpoE2Yw4TQ5uR
61
61
  cmdbox/app/features/cli/cmdbox_server_list.py,sha256=J9FLVq3B5hlEBK88rT867Ey32-bHAHpZy_X9VqjZLvI,5777
62
62
  cmdbox/app/features/cli/cmdbox_server_start.py,sha256=ci9vo1G9LtazQo9XYI4-_OdfHHhU_r8gFp-meWeE2vM,7279
63
63
  cmdbox/app/features/cli/cmdbox_server_stop.py,sha256=eSdo0vW0PYAU1VIC0-wWsGKNlmZ1J8SOfN18fL_AVrI,8644
64
- cmdbox/app/features/cli/cmdbox_web_apikey_add.py,sha256=RrmGWUoK5aqRnUu-CSVe0y5-FenjF0E3yYED8RJefhM,7151
65
- cmdbox/app/features/cli/cmdbox_web_apikey_del.py,sha256=EHZ5PND4lWM3ZKkBMXC2fT-tLnnBSVMLih-mxR8ztLk,7129
64
+ cmdbox/app/features/cli/cmdbox_web_apikey_add.py,sha256=fpqtVUt-48Ssn4yb4m-vWYs7-CjOROXS2v9QWItsBck,5253
65
+ cmdbox/app/features/cli/cmdbox_web_apikey_del.py,sha256=k9voMzQBA9lvtH3U37OF8Uj97pTH0lTt9aSLk2UP6ik,5231
66
66
  cmdbox/app/features/cli/cmdbox_web_gencert.py,sha256=tFqP4dBXeBYCFfNKcdKN49-waJrUCxa_zDcOV9yrIsA,11396
67
67
  cmdbox/app/features/cli/cmdbox_web_genpass.py,sha256=f450z1PxofpbrPsJccnHEjkXF975ZsLbBii8RkCgVCM,9541
68
- cmdbox/app/features/cli/cmdbox_web_group_add.py,sha256=p4VdIUv-hh0eXqV5ITyBFRUxGBeQxImHXEPv7s7SUv4,7419
69
- cmdbox/app/features/cli/cmdbox_web_group_del.py,sha256=qssAhZmY0wKfkpQ6UycT7G-_qQpyyE_T7w_hupgsajE,6629
70
- cmdbox/app/features/cli/cmdbox_web_group_edit.py,sha256=04U741NeIGqeuId8m2oSOFgSguQuTK0_Krt0nSMATrw,7358
71
- cmdbox/app/features/cli/cmdbox_web_group_list.py,sha256=4oITsdUEkPW4jZQOTiDQkgawJTUfxEyn1YFxDuf9SVk,6724
68
+ cmdbox/app/features/cli/cmdbox_web_group_add.py,sha256=scvYc9OCyaPn87m8X3ONi1bcXzmLS5e5FisjR9KYmp0,5599
69
+ cmdbox/app/features/cli/cmdbox_web_group_del.py,sha256=tmxpz_cK7PSZdiA0R94Ospf10EimNMHre5jBnpJsyKw,4809
70
+ cmdbox/app/features/cli/cmdbox_web_group_edit.py,sha256=-V3czGmUFJVcJOS7EiaT6cVPPqa7tRgtrJq7DaI6XWw,5538
71
+ cmdbox/app/features/cli/cmdbox_web_group_list.py,sha256=LfnXCNwgOFg_W-eQzDW8nXjdOKAmju5o1v5_8D9v1_A,4904
72
72
  cmdbox/app/features/cli/cmdbox_web_start.py,sha256=uNFXWpmrhMY6AEzYgf5RXlkc7yzHJIIJZs5dJ_7TZNU,17848
73
73
  cmdbox/app/features/cli/cmdbox_web_stop.py,sha256=5ja4IiWRSpfRrWfoRncMRmofEYj8MDfIFUcWfDtIOQ4,3567
74
- cmdbox/app/features/cli/cmdbox_web_user_add.py,sha256=WsuW1rt27dhxIY7aD_xyZblyEhBqq4Z_doE4Gd75O68,8611
75
- cmdbox/app/features/cli/cmdbox_web_user_del.py,sha256=t5CpPO4J9Wl2paBqSY_rA9vEYLXSxrYFB999Cvd-ZMU,6592
76
- cmdbox/app/features/cli/cmdbox_web_user_edit.py,sha256=jzwkjCNxW7vX0Nc4FIHn4hDO6PmBoVpPcmzr5P3W4rQ,8519
77
- cmdbox/app/features/cli/cmdbox_web_user_list.py,sha256=EGOcWMmRLZ_QHlb1twIZJ5xWSjSvDZZRTkYv9emANKI,6712
74
+ cmdbox/app/features/cli/cmdbox_web_user_add.py,sha256=rl5QDDw6hzKNN797II7zn7hFkejsCjabHera6TWxvNg,6791
75
+ cmdbox/app/features/cli/cmdbox_web_user_del.py,sha256=xGJs1XFuLVRlA0bpiyM5yO9tDMdfxm8VSYf4zZBHB6Y,4772
76
+ cmdbox/app/features/cli/cmdbox_web_user_edit.py,sha256=7Lb5uWlmxOx7Jq39pZm8D1NY3PLpqYJKEe7RoB7abR4,6699
77
+ cmdbox/app/features/cli/cmdbox_web_user_list.py,sha256=ODxHxjOVCnj6VfR3hLDaClVz6ETUyuCMHu4jhiRqGBY,4892
78
78
  cmdbox/app/features/web/cmdbox_web_agent.py,sha256=yBbPszQAkw3yfukJJ-xnQNoOsTsi32lm3WxR4iAMhJ4,14542
79
79
  cmdbox/app/features/web/cmdbox_web_assets.py,sha256=D1dYNrvC7xBAVAAHX6PkoB6RFehEofET4hkHeCFYq7s,1931
80
80
  cmdbox/app/features/web/cmdbox_web_audit.py,sha256=-flyijdnh3hN-BKnw0GI3gSiduLP0vQFg_AiYCLXRBY,3359
@@ -85,7 +85,7 @@ cmdbox/app/features/web/cmdbox_web_del_cmd.py,sha256=3Bx2tuXJXc63yip9gWH2bXBydD4
85
85
  cmdbox/app/features/web/cmdbox_web_del_pipe.py,sha256=tPLvuLqk-MQjkh5WZfw9gL3ujR_W18raEwX_EKddNZw,1193
86
86
  cmdbox/app/features/web/cmdbox_web_do_signin.py,sha256=Je9pYIdihmagP2eaIfyz6zIBbLc7_wHKxewjAQrt3IA,20787
87
87
  cmdbox/app/features/web/cmdbox_web_do_signout.py,sha256=b64XcmioyuyEL6VFymcs5kFIt4zviqhqJbFUWRCdMo0,1109
88
- cmdbox/app/features/web/cmdbox_web_exec_cmd.py,sha256=qfa6YzYkW0TxO-UCk1w88gzCF0BtJRAtz5cS7dn6CAA,13206
88
+ cmdbox/app/features/web/cmdbox_web_exec_cmd.py,sha256=cwiG8f2sn0rJwKZaff2zRtBjj6FqFIeGWcUqwsynC7c,13298
89
89
  cmdbox/app/features/web/cmdbox_web_exec_pipe.py,sha256=W9jd_9MTzC9GzgEd8X5C9Jwsn8pt6-_TFxyrHfO4iWk,10581
90
90
  cmdbox/app/features/web/cmdbox_web_filer download.py,sha256=CVRDv0TZAEd87nzlquIO2O3rSm_tpc3i88H27FgNW4Y,2344
91
91
  cmdbox/app/features/web/cmdbox_web_filer.py,sha256=2BdkOQFvaMMxtSoRz07RjercnfG51yChZiVrQGRDRTQ,1871
@@ -379,9 +379,9 @@ cmdbox/web/assets/tree-menu/image/file.png,sha256=Uw4zYkHyuoZ_kSVkesHAeSeA_g9_LP
379
379
  cmdbox/web/assets/tree-menu/image/folder-close.png,sha256=TcgsKTBBF2ejgzekOEDBFBxsJf-Z5u0x9IZVi4GBR-I,284
380
380
  cmdbox/web/assets/tree-menu/image/folder-open.png,sha256=DT7y1GRK4oXJkFvqTN_oSGM5ZYARzPvjoCGL6wqkoo0,301
381
381
  cmdbox/web/assets/tree-menu/js/tree-menu.js,sha256=-GkZxI7xzHuXXHYQBHAVTcuKX4TtoiMuyIms6Xc3pxk,1029
382
- cmdbox-0.6.3.dist-info/LICENSE,sha256=sBzzPc5v-5LBuIFi2V4olsnoVg-3EBI0zRX5r19SOxE,1117
383
- cmdbox-0.6.3.dist-info/METADATA,sha256=o68uXEPaEhHqDp9HvcnpzP4qXBc9KTt8-sLqUcrJjX4,33522
384
- cmdbox-0.6.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
385
- cmdbox-0.6.3.dist-info/entry_points.txt,sha256=1LdoMUjTD_YdxlsAiAiJ1cREcXFG8-Xg2xQTNYoNpT4,47
386
- cmdbox-0.6.3.dist-info/top_level.txt,sha256=eMEkD5jn8_0PkCAL8h5xJu4qAzF2O8Wf3vegFkKUXR4,7
387
- cmdbox-0.6.3.dist-info/RECORD,,
382
+ cmdbox-0.6.3.2.dist-info/LICENSE,sha256=sBzzPc5v-5LBuIFi2V4olsnoVg-3EBI0zRX5r19SOxE,1117
383
+ cmdbox-0.6.3.2.dist-info/METADATA,sha256=JEA6co8dTSOYH28LWFD30P6Sqzo078sF1C2eun2835I,33524
384
+ cmdbox-0.6.3.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
385
+ cmdbox-0.6.3.2.dist-info/entry_points.txt,sha256=1LdoMUjTD_YdxlsAiAiJ1cREcXFG8-Xg2xQTNYoNpT4,47
386
+ cmdbox-0.6.3.2.dist-info/top_level.txt,sha256=eMEkD5jn8_0PkCAL8h5xJu4qAzF2O8Wf3vegFkKUXR4,7
387
+ cmdbox-0.6.3.2.dist-info/RECORD,,