Source code for acore_soap_agent.cli.impl

# -*- coding: utf-8 -*-

"""
Command line low lever implementations.
"""

import typing as T
import time

from simple_aws_ec2.api import EC2MetadataCache
from acore_soap.api import ensure_response_succeeded

from ..request import SoapRequestLoader, SoapResponseDumper

if T.TYPE_CHECKING:  # pragma: no cover
    from mypy_boto3_s3.client import S3Client


[docs]def gm( input_string: str, username: T.Optional[str] = None, password: T.Optional[str] = None, host: T.Optional[str] = None, port: T.Optional[int] = None, delay: int = 100, raises: bool = True, s3_client: T.Optional["S3Client"] = None, output_s3uri: T.Optional[str] = None, ): """ 运行一个或多个 GM 命令. 例如 ``.server info``. :param input_string: 输入的字符串. 如果是以 s3:// 开头, 那么就去 S3 读数据, 此时需要给定 ``s3_client`` 参数. 否则就视为单个 GM 命令. :param username: 默认的用户名, 只有当 request.username 为 None 的时候才会用到. :param password: 默认的密码, 只有当 request.password 为 None 的时候才会用到. :param host: 默认的 host, 只有当 request.host 为 None 的时候才会用到. :param port: 默认的 port, 只有当 request.port 为 None 的时候才会用到. :param delay: 在运行每个 GM 命令之间的延迟时间, 单位为毫秒 :param raises: 默认为 True. 如果为 True, 则在遇到错误时抛出异常. 反之则将 failed SOAP Response 原封不动地返回. :param s3_client: 可选参数, 用于将结果保存到 S3 中. :param output_s3uri: 可选参数, 如果为 None, 则将结果打印到 stdout 中. 如果给定, 则将结果保存到 S3 中. 常用于返回结果特别大的情况. """ if input_string.startswith("s3://"): # pragma: no cover if s3_client is None: boto_ses = EC2MetadataCache.load().get_boto_ses_from_ec2_inside() s3_client = boto_ses.client("s3") requests = SoapRequestLoader.from_string( s=input_string, username=username, password=password, host=host, port=port, s3_client=s3_client, ) delay_ms = delay / 1000 responses = list() for request in requests: response = request.send() if delay: time.sleep(delay_ms) ensure_response_succeeded(request, response, raises=raises) responses.append(response) if output_s3uri is None: SoapResponseDumper.to_stdout(responses=responses) else: if s3_client is None: # pragma: no cover boto_ses = EC2MetadataCache.load().get_boto_ses_from_ec2_inside() s3_client = boto_ses.client("s3") SoapResponseDumper.to_s3( responses=responses, s3_client=s3_client, s3uri=output_s3uri, )