magic-pocket-cli 0.35.0__tar.gz → 0.36.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/PKG-INFO +2 -2
  2. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/inbound_cli.py +53 -36
  3. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/inbound.py +19 -4
  4. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pyproject.toml +2 -2
  5. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/.gitignore +0 -0
  6. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/__init__.py +0 -0
  7. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/__init__.py +0 -0
  8. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/aws_auth.py +0 -0
  9. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/backup_cli.py +0 -0
  10. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/build_cli.py +0 -0
  11. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/cloudfront_cli.py +0 -0
  12. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/cloudfront_keys_cli.py +0 -0
  13. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/cloudfront_waf_cli.py +0 -0
  14. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/container_cli.py +0 -0
  15. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/deploy_cli.py +0 -0
  16. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/destroy_cli.py +0 -0
  17. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/dsql_cli.py +0 -0
  18. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/image_cli.py +0 -0
  19. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/interaction.py +0 -0
  20. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/main_cli.py +0 -0
  21. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/migrate_cli.py +0 -0
  22. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/neon_cli.py +0 -0
  23. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/permissions_cli.py +0 -0
  24. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/rds_cli.py +0 -0
  25. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/removed_flags.py +0 -0
  26. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/resource_helper.py +0 -0
  27. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/runtime_config_cli.py +0 -0
  28. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/s3_cli.py +0 -0
  29. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/status_cli.py +0 -0
  30. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/store_url_helper.py +0 -0
  31. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/tidb_cli.py +0 -0
  32. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/upstash_cli.py +0 -0
  33. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/url_helper.py +0 -0
  34. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/vpc_cli.py +0 -0
  35. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/cli/waf_cli.py +0 -0
  36. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/django_cli.py +0 -0
  37. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/mediator.py +0 -0
  38. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/migrations.py +0 -0
  39. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/__init__.py +0 -0
  40. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/__init__.py +0 -0
  41. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/backup_common.py +0 -0
  42. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/__init__.py +0 -0
  43. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/codebuild.py +0 -0
  44. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/context_check.py +0 -0
  45. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/depot.py +0 -0
  46. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/docker.py +0 -0
  47. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/builders/dockerignore.py +0 -0
  48. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/cloudformation.py +0 -0
  49. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/ecr.py +0 -0
  50. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/efs.py +0 -0
  51. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/lambdahandler.py +0 -0
  52. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/poll.py +0 -0
  53. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/s3_utils.py +0 -0
  54. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/stack_backed.py +0 -0
  55. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/aws/state.py +0 -0
  56. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/backup.py +0 -0
  57. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/cloudfront.py +0 -0
  58. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/cloudfront_acm.py +0 -0
  59. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/cloudfront_keys.py +0 -0
  60. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/cloudfront_waf.py +0 -0
  61. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/container.py +0 -0
  62. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/dsql.py +0 -0
  63. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/inbound_template.py +0 -0
  64. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/neon.py +0 -0
  65. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/rds.py +0 -0
  66. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/s3.py +0 -0
  67. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/sqs_alert.py +0 -0
  68. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/tidb.py +0 -0
  69. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/upstash.py +0 -0
  70. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/resources/vpc.py +0 -0
  71. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cf_function_api_host.js +0 -0
  72. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cf_function_basic_auth_prelude.js +0 -0
  73. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cf_function_host_redirect_prelude.js +0 -0
  74. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cf_function_spa_auth.js +0 -0
  75. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cf_function_spa_fallback.js +0 -0
  76. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cloudfront.yaml +0 -0
  77. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cloudfront_acm.yaml +0 -0
  78. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cloudfront_keys.yaml +0 -0
  79. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/cloudfront_waf.yaml +0 -0
  80. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/container.yaml +0 -0
  81. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/cloudformation/vpc.yaml +0 -0
  82. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/init/django-dotenv.env +0 -0
  83. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/init/django-settings.py +0 -0
  84. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/init/pocket.Dockerfile +0 -0
  85. {magic_pocket_cli-0.35.0 → magic_pocket_cli-0.36.0}/pocket_cli/templates/init/pocket_simple.toml +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: magic-pocket-cli
3
- Version: 0.35.0
3
+ Version: 0.36.0
4
4
  Summary: CLI and deploy tools for magic-pocket.
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: awscrt>=0.19.0
7
7
  Requires-Dist: click>=8.1.7
8
8
  Requires-Dist: deepdiff>=6.7.1
9
9
  Requires-Dist: jinja2>=3.1.3
10
- Requires-Dist: magic-pocket<0.36,>=0.35.0
10
+ Requires-Dist: magic-pocket<0.37,>=0.36.0
11
11
  Requires-Dist: pathspec>=1.0.4
12
12
  Requires-Dist: python-on-whales>=0.68.0
13
13
  Requires-Dist: pyyaml>=6.0.1
@@ -10,7 +10,8 @@ from botocore.config import Config
10
10
  from pocket.inbound import SETUP_NOTIFICATION, receipt_id, validate_receipt_id
11
11
  from pocket.inbound_context import InboundContext
12
12
  from pocket.settings import Settings, parse_handler_ref
13
- from pocket_cli.resources.inbound import Inbound
13
+ from pocket_cli.cli import interaction
14
+ from pocket_cli.resources.inbound import Inbound, no_active_rule_set_guide
14
15
 
15
16
 
16
17
  @click.group()
@@ -27,48 +28,58 @@ def inbound(ctx, stage, name):
27
28
 
28
29
 
29
30
  @inbound.command()
31
+ @click.option(
32
+ "--format",
33
+ "output_format",
34
+ type=click.Choice(["text", "json"]),
35
+ default="text",
36
+ help="DNSレコードの出力形式",
37
+ )
30
38
  @click.pass_obj
31
- def init(resource):
32
- """共有rule setの初期化とドメイン検証の申請(初回のみ)。"""
33
- ses = boto3.client("ses", region_name=resource.context.region)
39
+ def init(resource, output_format):
40
+ """ドメイン検証を申請し、登録すべきDNSレコードを出力する(初回のみ)。
41
+
42
+ receipt rule setはaccount/regionで1つしかactiveにできない共有物のため、
43
+ project単位の道具であるpocketは作成も有効化もしない。
44
+ """
45
+ region = resource.context.region
46
+ ses = boto3.client("ses", region_name=region)
34
47
  active = ses.describe_active_receipt_rule_set().get("Metadata", {}).get("Name")
35
48
  if not active:
36
- name = "pocket-inbound"
37
- names = [
38
- item["Name"]
39
- for page in ses.get_paginator("list_receipt_rule_sets").paginate()
40
- for item in page["RuleSets"]
41
- ]
42
- if name in names:
43
- raise click.ClickException(
44
- "pocket-inboundが既にあります。内容を確認し管理者が有効化してください"
45
- )
46
- click.confirm(
47
- "このaccount/regionで初期化を同時実行していないことを確認してください。"
48
- "共有rule set pocket-inboundを作成・有効化しますか?",
49
- abort=True,
50
- )
51
- if ses.describe_active_receipt_rule_set().get("Metadata"):
52
- raise click.ClickException("active setが変わりました。再実行してください")
53
- ses.create_receipt_rule_set(RuleSetName=name)
54
- if ses.describe_active_receipt_rule_set().get("Metadata"):
55
- raise click.ClickException(
56
- "初期化中にactive setが変わりました。有効化を中止します"
57
- )
58
- ses.set_active_receipt_rule_set(RuleSetName=name)
59
- active = ses.describe_active_receipt_rule_set().get("Metadata", {}).get("Name")
60
- if active != name:
61
- raise click.ClickException("有効化後のactive setが一致しません")
49
+ raise click.ClickException(no_active_rule_set_guide(region))
62
50
  domain = resource.context.config.domain
63
51
  result = ses.get_identity_verification_attributes(Identities=[domain])
64
52
  identity = result.get("VerificationAttributes", {}).get(domain, {})
65
53
  token = identity.get("VerificationToken")
66
54
  if not token and identity.get("VerificationStatus") != "Success":
67
55
  token = ses.verify_domain_identity(Domain=domain)["VerificationToken"]
68
- click.echo(f"active rule set: {active}")
56
+ records = []
69
57
  if token:
70
- click.echo(f"TXT _amazonses.{domain} {token}")
71
- click.echo(f"MX {domain} 10 inbound-smtp.{resource.context.region}.amazonaws.com")
58
+ records.append({"type": "TXT", "name": f"_amazonses.{domain}", "value": token})
59
+ records.append(
60
+ {
61
+ "type": "MX",
62
+ "name": domain,
63
+ "priority": 10,
64
+ "value": f"inbound-smtp.{region}.amazonaws.com",
65
+ }
66
+ )
67
+ if output_format == "json":
68
+ payload = {
69
+ "active_rule_set": active,
70
+ "domain": domain,
71
+ "region": region,
72
+ "verification_status": identity.get("VerificationStatus") or "Pending",
73
+ "records": records,
74
+ }
75
+ click.echo(json.dumps(payload, ensure_ascii=False, indent=2))
76
+ return
77
+ click.echo(f"active rule set: {active}")
78
+ for record in records:
79
+ if record["type"] == "TXT":
80
+ click.echo(f"TXT {record['name']} {record['value']}")
81
+ else:
82
+ click.echo(f"MX {record['name']} {record['priority']} {record['value']}")
72
83
  click.echo("SES受信対応リージョンとMXの既存配送先を確認してDNSを登録してください。")
73
84
 
74
85
 
@@ -94,11 +105,17 @@ def show_yaml(resource):
94
105
 
95
106
 
96
107
  @inbound.command()
108
+ @click.option(
109
+ "--yes", "-y", is_flag=True, default=False, help="確認プロンプトをスキップ"
110
+ )
97
111
  @click.pass_obj
98
- def destroy(resource):
112
+ def destroy(resource, yes):
99
113
  """無効化・配送猶予・滞留解消後に自分のルールとスタックを削除する。"""
100
- click.confirm(
101
- "受信停止後36時間以上経過し、原本の照合・必要な退避を終えましたか?", abort=True
114
+ interaction.set_assume_yes(yes)
115
+ interaction.confirm(
116
+ "受信停止後36時間以上経過し、原本の照合・必要な退避を終えましたか?",
117
+ default=False,
118
+ abort=True,
102
119
  )
103
120
  resource.delete()
104
121
 
@@ -14,16 +14,31 @@ from pocket_cli.resources.aws.stack_backed import StackBackedResource
14
14
  from pocket_cli.resources.inbound_template import build_template
15
15
 
16
16
 
17
+ def no_active_rule_set_guide(region: str) -> str:
18
+ """active setが無いaccount/region向けの案内。
19
+
20
+ receipt rule setはaccount/regionで1つしかactiveにできない共有物なので、
21
+ pocketは作成・有効化しない。名前はSESコンソールが自動作成する
22
+ default-rule-setに揃えて案内する(既にactiveなsetがあれば名前は問わない)。
23
+ """
24
+ return (
25
+ "active な receipt rule set がありません。"
26
+ "account/regionで1回だけ次を実行してください"
27
+ "(account単位の土台なので、pocketは作成・有効化しません):\n"
28
+ " aws ses create-receipt-rule-set"
29
+ f" --rule-set-name default-rule-set --region {region}\n"
30
+ " aws ses set-active-receipt-rule-set"
31
+ f" --rule-set-name default-rule-set --region {region}"
32
+ )
33
+
34
+
17
35
  def resolve_rules(
18
36
  active: dict, ctx: InboundContext, deployed: dict | None
19
37
  ) -> tuple[str, str | None]:
20
38
  """明示指定なしならactive setへ末尾追加。既存bindingの漂流は拒否する。"""
21
39
  name = active.get("Metadata", {}).get("Name")
22
40
  if not name:
23
- raise ValueError(
24
- "active receipt rule set がありません。"
25
- "pocket resource inbound init を実行してください"
26
- )
41
+ raise ValueError(no_active_rule_set_guide(ctx.region))
27
42
  if ctx.config.rule_set and ctx.config.rule_set != name:
28
43
  raise ValueError("明示したrule_setがactive setと一致しません")
29
44
  expected = (deployed or {}).get("RuleSet") or ctx.config.rule_set
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "magic-pocket-cli"
3
- version = "0.35.0"
3
+ version = "0.36.0"
4
4
  description = "CLI and deploy tools for magic-pocket."
5
5
  requires-python = ">=3.10"
6
6
  dependencies = [
7
7
  # lib は同 minor に束縛する。0.x では minor が breaking の単位のため、
8
8
  # 上限なしだと cli を pin した消費者にも lib の破壊的変更が届いてしまう
9
- "magic-pocket>=0.35.0,<0.36",
9
+ "magic-pocket>=0.36.0,<0.37",
10
10
  "click>=8.1.7",
11
11
  "jinja2>=3.1.3",
12
12
  "python-on-whales>=0.68.0",